我的印象是节点可以是任何东西,无论是元素,属性等等。
我正在尝试迭代节点列表,例如....
Dim xmlDoc As New Xml.XmlDocument
xmlDoc.LoadXml("
< main1 test1 = 'any' test2 = 'any2' >
< test1 > ttr < /test1 >
< test1 > ttr < /test1 >
< test1 > ttr < /test1 >
< test1 > ttr < /test1 >
< /main1 >")
问题1
为什么以下只返回元素,而不是属性:
For Each objnode As Xml.XmlNode In xmlDoc.DocumentElement.ChildNodes
Console.WriteLine(objnode.Name)
Next
问题2
如何使用xpath迭代所有节点,无论类型如何?
答案 0 :(得分:3)
在DOM模型中,System.Xml.XmlDocument / XmlElement / XmlNode实现了ChildNodes集合,为您提供了所有被视为容器节点的子节点的节点,可以是元素节点,文本节点,注释节点,处理指令节点(并为XmlDocument提供DOCTYPE节点和XML声明)。属性节点不被视为该模型中的子节点,因此您无法在ChildNodes集合中找到它们。如果您有兴趣,可以访问the Attributes collection。
[编辑]
那么你可以使用XPath联合运算符|
来选择和处理节点的并集,所以XML就是
<!-- comment 1 -->
<root att1="value 2" att2="value 2">Text<!-- comment 2 --><child att3="value 3">
<descendant/>
</child>
</root>
以下VB片段
Dim doc As New XmlDocument()
doc.Load("file.xml")
For Each node As XmlNode In doc.SelectNodes("//node() | //@*")
Console.WriteLine("Found node of type {0} with name {1}", node.NodeType, node.Name)
Next
输出
Found node of type Comment with name #comment
Found node of type Element with name root
Found node of type Attribute with name att1
Found node of type Attribute with name att2
Found node of type Text with name #text
Found node of type Comment with name #comment
Found node of type Element with name child
Found node of type Attribute with name att3
Found node of type Element with name descendant
这样你就可以选择一个路径表达式来选择属性以及元素节点,文本节点和注释节点。
你还应该知道DOM和XSLT / XPath在它们的树模型中有一些不匹配,例如DOM区分普通文本节点和CDATA节节点,XPath不这样做。 DOM允许相邻的文本节点,XPath不会这样做。因此,虽然您经常可以针对DOM树编写XPath查询,而Microsoft支持使用MSXML的DOM实现和.NET的DOM实现,但您需要了解XPath定义的树模型之间的细微差别,并且在执行SelectSingleNode时使用XPath或System.Xml.XmlDocument / XmlElement / XmlNode中的SelectNodes。