visualbasic:使用VisualBasic操纵XML文档

  对于XML文档插入、修改、检索等数据操作工作可以通过个XML解析器及其列举系列对象来完成 MicrosoftXML解析器驻留在名为msxml.dll动态链接库文件中msxml是个COM对象所以可以在任何兼容ActiveX环境中使用它如在VB和 ASP中本文介绍在Visual Basic中操纵XML文档具体思路方法 

  装载XML文档 

  新建个VB Standard EXE工程项目在Form1中添加个CommandButtonControl控件将其Name和Caption属性分别设为cmdLoad和Load XML为了使用msxml解析器必须事先设置工程项目对msxml.dll引用选择Project菜单 References命令选中Microsoft XML, version 2.0或更高版本将下列代码加入 cmdLoad_Click事件: 

Option Explicit
Dim xml As DOMDocument
Private Sub cmdLoad_Click
Set xml = New DOMDocument
Call xml.Load(App.Path & “flight.xml")
' flight.xml为描述航班信息XML文档
End Sub


  运行该点击Load XML按钮即可装载XML文档载入XML文档包含个按照树状结构排列节点对象集合顶层节点或根节点是 documentElement每个节点都有组属性和思路方法每个节点可以包含个或多个子节点当然也可以不包含任何节点必须先取得对根节点引用才能操纵XML文档在 cmdLoad_Click事件代码后添加下列代码: 

  Dim root As IXMLDOMElement

  Set root = xml.documentElement

  遍历节点集合 

  可以使用Visual BasicFor Each...Next循环结构在节点对象集合中循环在cmdLoad_Click事件代码后添加下列代码: 

Dim node As IXMLDOMNode
For Each node In root.childNodes
Debug.Pr node.Text
Next


  运行后点击Load XML按钮将会在Immediate窗口中看到如下输出结果: 

  2000年10月15日 

  北京 首都国际 香港 赤邋角 中国国际航空公司 波音公司 

  B747 13:00 15:55 

  上海 浦东 法兰克福 美茵 塔什干 尤日内 汉莎航空公司 空中客车工业公司 

  A330 21:45 01:45 

  注意每个节点Text属性不仅包含自身属性值还包含其下属所有子节点Text属性值般情况下不会同时操作所有节点可以使用 selectNodes思路方法取得对个特定节点子集引用selectNodes思路方法返回个 IXMLDOMNodeList对象在cmdLoad_Click事件代码后添加下列代码: 

Dim flightNodes As IXMLDOMNodeList
Set flightNodes = root.selectNodes(“航班")
For Each node In flightNodes
Debug.Pr node.selectSingleNode
(“离站时间").Text & “——" 
&node.selectSingleNode (“到站时间").Text
Next


  这段代码使用selectNodes思路方法选择根节点下所有“航班”节点然后使用selectSingleNode思路方法选择“航班”节点下“离站时间”和“到站时间”读取并打印它们Text属性值 

  可以使用childNodes集合以递归方式层次化显示XML 文档内容 

  首先在Form1中声明个子过程PrettyPr 

Public Sub PrettyPr(node As IXMLDOMNode,
Optional tabLevel As Integer=0)
Dim childNode As IXMLDOMNode
If node.nodeName<>vbNullStrin 
And node.nodeName < >“#text" Then
Debug.PrString(tabLevel,Chr$(9))
&“< "&node.nodeName&“ >"
  
End If
If node.hasChildNodes Then
For Each childNode In node.childNodes
Call PrettyPr(childNode,tabLevel+1)
Next
Else
Debug.PrString(tabLevel+1,Chr$(9))&node.Text
End If
If node.nodeName< >vbNullString And node.nodeName
< >“#text" Then
Debug.PrString
(tabLevel,Chr$(9))&“< /"&node.nodeName&“ >"
End If
End Sub


  然后在Form1中加入第2个CommandButtonControl控件将其 Name和Caption属性分别设为cmdPr和Pr将下列代码加入事件cmdPr_Click中: 

Private Sub cmdPr_Click
If Not xml Is Nothing Then
Call PrettyPr
(xml.documentElement)
End If
End Sub


  运行首先点击Load XML按钮加载flight.xml然后点击Pr按钮在Immediate窗口中可以看到层次分明、易于阅读输出结果子过程 PrettyPr在documentElement子节点中循环打印每个节点nodeName属性值而每个子节点又递归PrettyPrXML文档内各节点内在相似性是XML最具吸引力特性每个子节点都和其父节点有着相同属性和思路方法(尽管各自内容通常区别)这就使得为同文档中所有或部分节点编写某种规则变得相对简单 

  修改节点内容 

  如同修改数据库中记录也可以修改XML文档中节点内容下列代码修改了flight.xml文档中“发布日期”节点Text属性值: 

Set node = root.selectSingleNode(“发布日期")
If Not node Is Nothing Then
node.Text = “2000年10月20日"
End If


  修改了文档内容的后可以使用Save思路方法保存修改后文档Save思路方法可以将XML文档保存为文件、数据流或ASPResponse对象Save思路方法使用方法如下: 

  xml.save App.Path & “flightupdated.xml"

  将上面两段代码添加在cmdLoad_Click事件中运行点击Load XML按钮工作目录中会增加个新文件flightupdated.xml在IE5 中打开该文件可以看到“发布日期”标记文本已经被改为“2000年10月20日” 



  在实际应用中XML可以被用作数据传输格式、可搜索数据库、可定制数据存储方式和显示信息数据源(需要XSL或如VB这样编程语言帮助)msxml是个COM对象所以可以在ASP页中使用它例子然后方便地使用VBScript或JScript编程来操纵它



Tags:  visualbasic2008 visualbasic.net visualbasic6.0 visualbasic

延伸阅读

最新评论

发表评论