我有一个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>
答案 0 :(得分:5)
你真的想要所有后代或只是顶级元素吗?如果您只想要顶级的那些,那么使用Elements()
方法 - 它返回当前节点下的所有元素。
问题不在于重复节点 - 更高级别的节点包括更低级别的节点。所以返回更高级别的节点,然后返回更低级别的节点,并且你正在写出这两个节点的整个,这意味着你要写出更低级别的节点两次。
如果只是写出,比如你正在查看的节点的名称,你就不会发现问题。但你还没有说出你真正要做的事情,所以我不知道这是否有帮助...
答案 1 :(得分:0)
XmlDocument doc = new XmlDocument();
doc.LoadXml(XML);
XmlNodeList allElements = doc.SelectNodes("//*");
foreach(XmlElement element in allElements)
{
// your code here
}