2013-05-09 3 views
0

У меня есть XML, как:получение ChildNodes из XML-узла

<?xml version="1.0" encoding="utf-8" ?> 
<response list="true"> 
    <count>10748</count> 
    <post> 
     <id>164754</id> 
     <text></text> 
     <attachments list="true"> 
      <attachment> 
       <type>photo</type> 
       <photo> 
        <pid>302989460</pid> 
       </photo> 
      </attachment> 
     </attachments> 

мне нужно проверить, есть ли в моем <post><attachment>. Я получаю все сообщения, как это:

XmlNodeList posts = XmlDoc.GetElementsByTagName("post"); 
foreach (XmlNode xnode in posts) 
{ 
    //Here I have to check somehow 
} 

Если нет <attachment> узла в посте, я хочу, чтобы получить его <text> вместо этого.

+0

Что вы хотите получить? список элементов или значений? – lexeRoy

ответ

1

Если вы изменили значение с XmlDocument на номер XElement, вы можете использовать запрос LINQ, чтобы получить количество узлов attachment.

//load in the xml 
XElement root = XElement.Load("pathToXMLFile"); //load from file 
XElement root = XElement.Parse("someXMLString"); //load from memory 

foreach (XElement post in root.Elements("post")) 
{ 
    int numOfAttachNodes = post.Elements("attachments").Count(); 

    if(numOfAttachNodes == 0) 
    { 
     //there is no attachment node 
    } 
    else 
    { 
     //something if there is an attachment node 
    } 
} 
-1

Чтобы проверить, есть ли какие-либо узлы «» сообщений:

if(posts.Count == 0) 
{ 
    // No child nodes! 
} 

Вы можете сделать это перед началом цикла.

+0

-1. Это проверяет общее количество дочерних узлов, но не выделяет узлы «вложения» из «текстовых» узлов. – gunr2171

0

вы можете попробовать Linq запрос было бы как этот

var result = XmlDoc.Element("response") 
        .Elements("post").Select(item => item.Element("attachments")).ToList(); 

foreach(var node in result) 
{ 

} 
+0

Проблема в том, что его существующие переменные используют 'XmlDocument', а не' XElement'. Вот почему я сделал предложение по использованию последнего. – gunr2171

Смежные вопросы