通过它包含的内容迭代XmlDocument中的每个节点

时间:2016-10-12 01:30:26

标签: c# xml

我很难确定迭代XML文档中的每个节点(递归地)确定当前节点是否具有值,或者,如果它具有嵌入的XML。

似乎在两种情况下都将XmlNode.NodeType设置为Element,并且在XML具有值(而不是更多XML)的情况下,ChildNodes.Count不为null(实际上,它是1)。

我用于测试的简单XML文件是:

<note>
  <to>You</to>
  <from>Me</from>
  <subject>Hello!</subject>
  <body>Check out this cool data!</body>
  <data>
    <name>Something cool</name>
    <location>Mars</location>
    <distance>54 million kilometers</distance>
  </data>
</note>

上面的每个XmlNode都是&#39;元素&#39;并使用ChildNodes&gt; = 1。

我可以使用什么来可靠地测试是否应将XmlNode视为容器(如注释和数据)或保存值(如,来自主题,正文,姓名,位置,距离)?

4 个答案:

答案 0 :(得分:1)

通常,您通过了解XML的结构知道哪些节点包含值。

如果您需要从任何结构的XML推断出该信息 - 由TEXT和CDATA节点表示的文本,那么您可以检查元素是否只有这些类型的子元素来获取&#34;仅文本&#34;节点。请参阅How to get text inside an XmlNode

有些人需要了解/做出以下决定:

  • 混合内容节点(<r>foo <v/> bar</r>) - 决定您要对它们执行的操作。即具有HTML内容的节点通常包含&#34;混合内容&#34;。
  • 文本节点表示元素之间无关紧要的空白(<r> <n/> </r>)。除非必须保留文档格式,否则应忽略这些格式
  • 表示单个文本的多个节点。根据加载或构造XML的方式,可以通过子文本节点的集合而不是单个节点来表示单个文本。

答案 1 :(得分:1)

我不知道你是否可以在这里使用System.Xml.Linq.XElement代替XmlDocument,但如果可以的话,你可以通过以下方式解决这个问题:

var xml = XElement.Parse("<note> .... </note>");

然后

xml.Elements().Count()

返回5正确数量的子节点,而

xml.Elements().First().Elements().Count()

返回0,因为to节点没有子节点......

答案 2 :(得分:0)

从您的示例中,您可以检查第一个子节点是否为Element类型。

bool isContainer(XmlNode node) {
  return node.ChildNodes.Count > 0 && node.ChildNodes[0].NodeType == XmlNodeType.Element;
}

请注意,这不会处理混合内容数据。

答案 3 :(得分:0)

查看这篇文章中的答案,看看它是否能让你朝着正确的方向前进:

How to get "real" ChildNodes of XmlNode, ignoring whitespace nodes?