Вызов узлов Descendant без повторения каждого узла

2

У меня есть 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
Лучший ответ

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

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

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

  • 0
    В конце концов я хочу иметь только <FirstElement xsi: type = "myType"> <SecondElement> A </ SecondElement> </ FirstElement> <FirstElement xsi: type = "myType"> <SecondElement> B </ SecondElement> </ FirstElement>
  • 0
    Под "иметь", что именно для вас значит? Вы на самом деле записываете их в StringBuilder или это просто для диагностики? Похоже, вам может понадобиться вызов Elements ()
Показать ещё 2 комментария
0
XmlDocument doc = new XmlDocument();
doc.LoadXml(XML);
XmlNodeList allElements = doc.SelectNodes("//*");
foreach(XmlElement element in allElements)
{
  // your code here
}
  • 0
    Это приводит к тому же поведению.
  • 0
    Я думаю, что Джон обнаружил, что настоящая проблема заключалась в выписывании всех узлов, а не возвращении нескольких узлов.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню