你通过ixmldomnode界面实现的两个属性来访问节点的类型。nodetype属性列举了domnodetype所有项目(一些项目列举在上面的表格上)。另外,你可以用nodetypestring属性来获得表示节点类型的字符串。
一旦你有了文档的dom引用,你就可以遍历节点的层次。通过文档引用,你可以访问childnodes属性,它给出了一个自上而下的包含所有节点的目录。childnodes属性实现了ixmldomnodelist,它支持visual basic的for/each结构,所以你可以列举出childnodes中的所有节点。另外,childnodes属性还实现了level属性,它可以返回所有子节点的数目。
不只是文档对象有childnodes属性,每一个节点都有childnodes属性。因为如此,childnodes属性和ixmldomnode's haschildnodes属性配合,使你非常方便的遍历文档,访问元素,属性,值。
值得一提的是,元素和元素值之间是父子关系。例如在 cds xml文档中,元素<title>表示歌曲的名字,要知道<title>的值,你需要访问节点的属性node_text。如果你发现一个节点有你感兴趣的数据,你可以访问它的属性,也可以通过parentnode属性来访问它们的父节点。
你能够遍历文档的节点是利用文档对象,因为xml本身就是层次结构,所以很容易编写递归代码来访问整个文档。
loaddocument程序打开xml文档,然后调用另一个程序displaynode,它用来显示文档的结构。loaddocument传递给正在打开的xml文档的childnodes属性一个引用作为它的参数,同时传递一个整数用来标示开始显示的层次级别。代码利用参数来格式化在visual basic文档结构显示窗口中的文本。
displaynode属性的函数会遍历文档寻找需要的node_text节点类型串,一旦代码找到一个node_text的节点,它会利用nodevalue属性来获得相应的文本串。另外,当前节点的parentnode属性指向一个元素类型的节点。元素节点实现了一个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
' the document loaded successfully.
' now do something intersting.
displaynode xdoc.childnodes, 0
else
' the document failed to load.
' see the previous listing for error information.
end if
end sub
public sub displaynode(byref nodes as msxml.ixmldomnodelist, _
byval indent as integer)
dim xnode as msxml.ixmldomnode
indent = 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,则有子节点。
这仅仅是个开始,你现在可以更深的了解xml和microsoft 解析器(msxml.dll)。你可以作一些有趣的事例如改变某个节点的值,搜索文档,建立你自己的文档等等。访问 msdn online xml developer center以获得更多的例子,文章和下载。