2017-02-20 206 views
0

给出的例子XML文件作为这样的:的XDocument - 遍历XML元素

<libraries> 

    <library name="some library"> 
    <book name="my book"/> 
    <book name="your book"/> 
    </library> 

    <library name="another library"> 
    <book name="his book"/> 
    <book name="her book"/> 
    </library> 

</libraries> 

如何将一个通过每个迭代库并获得唯一的孩子呢?例如。如果我在第一个图书馆元素中,并且我去检索它的所有后代/孩子,它只会返回其中的两本书。我试过迭代和使用XElement.Elements(“书”),XElement.Elements(),XElement.Descendants()等,但都返回每本书的元素(所以它会拉动元素来自第二个图书馆)。大多数情况下,我认为我只是在理解XDocument如何跟踪其元素以及什么是后代/孩子。如果可能的话,如果可以解释如何在XDocument中对任何级别的元素进行这种操作,那么可以理解它(例如,如果每本书都有子元素,并且这些元素具有子元素等) 。

回答

0

您可以通过以下方式遍历所有库的后代来遍历XML。

XDocument doc=XDocument.Load(XmlPath); 
    foreach (var item in doc.Descendants("library")) 
    IEnumerable<XNode> nodes = item.DescendantNodes();//Here you got book nodes within a library 
+0

原来,这就是我试图除了在我昏昏欲睡的状态,昨晚,我已经typo'd,并做了IEnumerable 节点= doc.DescendantNodes()VS item.DescendantNodes();这是我正在寻找的。谢谢! – Sheer

0

纯粹的,

问题是你拉着“书”的所有元素。

如果您只想获取依赖于父元素的项目,则必须提供适当的条件。

var v = from n in doc.Descendants("library") 
       where n.Attribute("name").Value == "some library" 
       select n.DescendantNodes(); 

现在,这会给你元素谁的名字是“一些图书馆”。