У меня есть 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>
Вы действительно хотите, чтобы все потомки или только элементы верхнего уровня? Если вы хотите только верхний уровень, используйте метод Elements()
, который возвращает все элементы непосредственно под текущим node.
Проблема заключается не в том, что узлы повторяются, а в том, что узлы более высокого уровня включают узлы нижнего уровня. Таким образом, возвращается более высокий уровень node, затем нижний уровень, и вы пишете все оба этих узла, а это означает, что вы дважды записываете node на нижнем уровне.
Если вы просто напишете, скажем, имя node, на которое вы смотрите, вы не увидите проблемы. Но вы не сказали, что вы действительно пытаетесь сделать, поэтому я не знаю, помогает ли это...
XmlDocument doc = new XmlDocument();
doc.LoadXml(XML);
XmlNodeList allElements = doc.SelectNodes("//*");
foreach(XmlElement element in allElements)
{
// your code here
}