在XML文档中检索信息
加载文档之后,下一步就是从文档中检索信息。虽然文档对象是重要的,但仍可发现,在大部分时间里都在使用 IXMLDOMNode 接口。利用 IXMLDOMNode 接口来读写单独的节点元素。在做任何事情之前,必须了解 MSXML 分析程序通常支持的 13 种节点类型。下表列出了几种最常遇见的节点类型。
通过 IXMLDOMNode 接口显露的两个属性来访问节点类型。NodeType 属性显露了 DOMNodeType 项目的枚举(其中有些已列入上面的表中)。此外,还可以用 NodeTypeString 来检索节点类型的文本串。
广州网站建设,网站建设,广州网页设计,广州网站设计
当有了文档的引用之后,就可以开始在节点的层次中来回移动了。从您的文档引用可以访问 ChildNodes 属性,它提供了从上到下的入口,可以到达文档中的所有节点。ChildNodes 属性显露了 IXMLDOMNodeList,它支持 Visual Basic For/Each 构造。因此,您可以枚举 ChildNodes 属性的所有单个节点。此外,ChildNodes 属性显露 Level 属性,它可以返回现有子节点的数量。
文档对象不仅显露了 ChildNodes 属性,还显露了所有单个节点。这样,与 IXMLDOMNode 的 HasChildNodes 属性联合起来,就使得在节点层次中来回移动来检查元素、属性和值,变得十分简单。
需要提醒的一件事情就是,文档元素和元素值之间的主从关系。例如,在 CD XML 文档中,元素<标题>显露了一首歌的标题。要检索<标题>元素的实际值,需要寻找 NODE_TEXT 类型的节点。当找到了具有感兴趣数据的节点之后,就可以检查属性,甚至通过 ParentNode 属性到达并访问其主节点。
如何在文档中来回移动?
在 XML 文档中,可以在一组被文档对象显露的节点中来回移动。因为 XML 文档本来就是分层的,所以编写在整个文档中来回移动的递归例程要相对容易些。LoadDocument 例程打开 XML 文档。然后 LoadDocument 调用另一个例程 DisplayNode,它在文档中真正地来回移动。LoadDocument 将引用当作参数和整数值传递到当前打开的 XML 文档的 ChildNodes 属性,指定从何处开始缩排级。代码使用缩排参数,在文档结构的 Visual Basic“快速窗口”中,将文本的显示格式化。
DisplayNode 函数在文档中来回移动,寻找特定于 NODE_TEXT 类型的节点。当代码找到了 NODE_TEXT 类型的节点之后,它用 NodeValue 属性来检索该节点的文本。此外,当前节点的 ParentNode 属性被用来获得 NODE_ELEMENT 类型节点的回溯引用。NODE_ELEMENT 类型的节点显露了 NodeName 属性。NodeName 和 NodeValue 的内容被显示。
广州网站建设,网站建设,广州网页设计,广州网站设计
如果通过检查 HasChildNodes 属性,确定该节点有子节点,则 DisplayNode 递归调用其自身,直到到达该文档的末尾。DisplayNode 例程用 Debug.Print 将信息写入 Visual Basic 的“快速窗口”:
- Public Sub LoadDocument()
- Dim xDoc As MSXML.DOMDocument
- Set xDoc = New MSXML.DOMDocument
- xDoc.validateOnParse = False
- If xDoc.Load("C:\My Documents\sample.xml") Then
- ' 文档加载成功。
- ' 现在做一些有趣的事情。
- DisplayNode xDoc.childNodes, 0
- Else
- ' 文档加载不成功。
- ' 查看前面列出的错误信息。
- End If
- End Sub
- Public Sub DisplayNode(ByRef Nodes As MSXML.IXMLDOMNodeList, _
- ByVal Indent As Integer)
- Dim xNode As MSXML.IXMLDOMNode
- IndentIndent = Indent + 2
- For Each xNode In Nodes
- If xNode.nodeType = NODE_TEXT Then
- Debug.Print Space$(Indent) & xNode.parentNode.nodeName & _
- ":" & xNode.nodeValue
- End If
- If xNode.hasChildNodes Then
- DisplayNode xNode.childNodes, Indent
- End If
- Next xNode
- End Sub
DisplayNode用HasChildNodes属性来确定它是否应当再调用其自身。您还应当用节点的Level属性并检查大于0的值。