按名称选择子节点的子集

27

鉴于这个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文档,我想为每个“Item”节点仅选择“property”子节点。如何直接在C#中完成?通过“直接”,我的意思是不选中Item的所有子节点,然后逐一检查。到目前为止:

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

40
您可以使用 SelectNodes(xpath) 方法替代 ChildNodes 属性:
foreach(XmlNode child in node.SelectNodes("property"))
{
    doSomethingElse()
}

演示。


1
等一下,这会同时选择所有“属性”节点,我正在尝试仅选择当前“项”节点的子节点。 - accand
1
@user2567853 很抱歉,那是因为我在 property 前面加了双斜杠 //。删除双斜杠就可以解决这个问题。 - Sergey Kalinichenko
1
只是一个小提示(不是 OP 要求的内容):如果你只有一个子节点,可以使用 node.SelectSingleNode("property") - checksum

9

尝试使用LINQ to XML而不是XML DOM,因为它的语法更简单,更适合您想要做的事情。

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

1
谢谢你的回答,听起来很不错,但是我现在是一个真正的新手,对另一个提出的解决方案更加熟悉。但是我会记住这个方案以备将来使用... - accand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接