调用DescendantNodes而不重复每个节点

时间:2009-06-11 21:19:08

标签: c# xml

我有一个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 个答案:

答案 0 :(得分:5)

你真的想要所有后代或只是顶级元素吗?如果您只想要顶级的那些,那么使用Elements()方法 - 它返回当前节点下的所有元素。

问题不在于重复节点 - 更高级别的节点包括更低级别的节点。所以返回更高级别的节点,然后返回更低级别的节点,并且你正在写出这两个节点的整个,这意味着你要写出更低级别的节点两次。

如果只是写出,比如你正在查看的节点的名称,你就不会发现问题。但你还没有说出你真正要做的事情,所以我不知道这是否有帮助...

答案 1 :(得分:0)

XmlDocument doc = new XmlDocument();
doc.LoadXml(XML);
XmlNodeList allElements = doc.SelectNodes("//*");
foreach(XmlElement element in allElements)
{
  // your code here
}