Вызов узлов Descendant без повторения каждого узла - PullRequest
2 голосов
/ 12 июня 2009

У меня есть XML, который я хотел бы получить все его элементы. Я попытался получить эти элементы с помощью Descendants () или DescendantNodes (), но оба они вернули мне повторяющиеся узлы

Например, вот мой xml:

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <FirstElement xsi:type="myType">
    <SecondElement>A</SecondElement> 
  </FirstElement>
</Root>

и когда я использую этот фрагмент:

 XElement Elements = XElement.Parse(XML);
 IEnumerable<XElement> xElement = Elements.Descendants();
 IEnumerable<XNode> xNodes = Elements.DescendantNodes();
 foreach (XNode node in xNodes )
 {
     stringBuilder.Append(node);
 }

это дает мне два узла, но повторяет <SecondElement>. Я знаю, что потомки все время называют его детьми, а дети - детьми, но есть ли другой способ избежать этого?

Тогда это содержимое моего stringBuilder:

<FirstElement xsi:type="myType"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <SecondElement>A</SecondElement> 
</FirstElement>

<SecondElement>A</SecondElement>

Ответы [ 2 ]

5 голосов
/ 12 июня 2009

Ну, вы на самом деле хотите всех потомков или только элементы верхнего уровня? Если вам нужны только элементы верхнего уровня, используйте метод Elements(), который возвращает все элементы непосредственно под текущим узлом.

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

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

0 голосов
/ 12 июня 2009
XmlDocument doc = new XmlDocument();
doc.LoadXml(XML);
XmlNodeList allElements = doc.SelectNodes("//*");
foreach(XmlElement element in allElements)
{
  // your code here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...