2017-02-20 6 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 ("book"), 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() против item.DescendantNodes(); это то, что я искал. Спасибо! – Sheer

0

Sheer,

Проблема заключается в том, что вы тянете все элементы с "заказать".

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

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

Теперь это даст вам элемент, имя которого является «некоторой библиотекой».