2015-05-21 4 views
4

Учитывая этот XML-документВыберите подмножество ChildNodes по имени

<listOfItem> 
    <Item id="1"> 
    <attribute1 type="foo"/> 
    <attribute2 type="bar"/> 
    <property type="x"/> 
    <property type="y"/> 
    <attribute3 type="z"/> 
    </Item> 
    <Item> 
    //... same child nodes 
    </Item> 
//.... other Items 
</listOfItems> 

Учитывая этот XML-документ, я хотел бы выбрать для каждого узла «Item», просто «собственность» дочерние узлы. Как я могу сделать это прямо в C#? С «прямо» я имею в виду, не выбирая все дочерние узлы Item и затем проверяя один за другим. До сих пор:

XmlNodeList nodes = xmldoc.GetElementsByTagName("Item"); 
foreach(XmlNode node in nodes) 
{ 
    doSomething() 
    foreach(XmlNode child in node.ChildNodes) 
    { 
    if(child.Name == "property") 
    { 
     doSomethingElse() 
    } 
    } 
} 

ответ

5

Вы можете использовать SelectNodes(xpath) метод вместо ChildNodes собственности:

foreach(XmlNode child in node.SelectNodes("property")) 
{ 
    doSomethingElse() 
} 

Demo.

+0

Спасибо! Это то, что я искал – accand

+0

Подождите секунду, это выберет сразу все узлы «свойство», я пытаюсь выбрать onlt одного из дочерних элементов текущего узла «Item». – accand

+0

@ user2567853 К сожалению, это потому, что я положил '//' перед 'свойством'. Удаление двойного слэша должно исправить это. – dasblinkenlight

2

Попробуйте использовать LINQ для XML вместо XML DOM, как это гораздо проще синтаксис для того, что вы хотите сделать.

XDocument doc = XDocument.Load(filename); 
foreach (var itemElement in doc.Element("listOfItems").Elements("Item")) 
{ 
    var properties = itemElement.Elements("property").ToList(); 
} 
+0

Спасибо за ваш ответ, кажется, очень хорошо, но в этот момент я настоящий новичок, и я лучше знакомы с другим предлагаемым решением. Но я буду держать этот ум за другие работы ... – accand

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