web-dev-qa-db-ja.com

名前で子ノードのサブセットを選択します

このxmlドキュメントを考える

<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ドキュメントが与えられたら、「アイテム」ノードごとに、「プロパティ」子ノードのみを選択したいと思います。 C#で直接行うにはどうすればよいですか? 「直接」では、Itemのすべての子ノードを選択せず​​に、1つずつ確認します。これまでのところ:

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

ChildNodesプロパティの代わりに SelectNodes(xpath) メソッドを使用できます。

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

デモ

23
dasblinkenlight

XML DOMの代わりにLINQ to XMLを使用してみてください。これは、目的に合わせてはるかに単純な構文です。

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