装载XML文档 新建一个VB Standard EXE工程项目。在Form1中添加一个CommandButton控件,将其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
Dim root As IXMLDOMElement Set root = xml.documentElement
遍历节点集合 可以使用Visual Basic的For Each...Next循环结构在节点对象集合中循环。在cmdLoad_Click事件代码后添加下列代码: Dim node As IXMLDOMNode For Each node In root.childNodes Debug.Print node.Text Next
Dim flightNodes As IXMLDOMNodeList Set flightNodes = root.selectNodes(“航班") For Each node In flightNodes Debug.Print node.selectSingleNode (“离站时间").Text & “——" &node.selectSingleNode (“到站时间").Text Next
Public Sub PrettyPrint(node As IXMLDOMNode, Optional tabLevel As Integer=0) Dim childNode As IXMLDOMNode If node.nodeName<>vbNullStrin And node.nodeName < >“#text" Then Debug.PrintString(tabLevel,Chr$(9)) &“< "&node.nodeName&“ >" End If If node.hasChildNodes Then For Each childNode In node.childNodes Call PrettyPrint(childNode,tabLevel+1) Next Else Debug.PrintString(tabLevel+1,Chr$(9))&node.Text End If If node.nodeName< >vbNullString And node.nodeName < >“#text" Then Debug.PrintString (tabLevel,Chr$(9))&“< /"&node.nodeName&“ >" End If End Sub
修改节点内容 如同修改数据库中的记录一样,也可以修改XML文档中节点的内容。下列代码修改了flight.xml文档中“发布日期”节点的Text属性值: Set node = root.selectSingleNode(“发布日期") If Not node Is Nothing Then node.Text = “2000年10月20日" End If
DOMDocument 类 文档对象模型(DOM)使用了一系列相应的对象描述了XML文档的等级状态,DOMDocument类是一个描绘XML文档的DOM结构的MSXML类。 DOMDocument类仅仅提供了很少的几个有用的属性和方法。Load方法载入一个xml文件,loadxml方法将字符串作为xml数据添加到对象中。例如,下面的代码就将一个小的xml文件添加到名为xml_document的文档中。Dim xml_document As New DOMDocumentxml_document.loadXML _ "<Person>" & vbCrLf & _ " <FirstName>Rod</FirstName>" & vbCrLf & _ " <LastName>Stephens</LastName>" & vbCrLf & _ "</Person>" DOMDocument的xml属性返回文档的xml描述,可以显示这些返回值看看这些文档究竟是什么样子,也可以将它存储为一个文件,但这完全不必要,因为DOMDocument对象的save方法已经自动将他们存储了。 DOMDocument对象的documentElement属性表示文档数据的根结点,通常情况下操作XML文档都从这里开始。 DOMDocument提供了几种创建新节点的方法。CreateElement方法为文档创建一个新的元素节点,其他创建节点的方法有createAttribute, createProcessingInstruction, 和 createTextNode,在这里就不一一介绍了。 IXMLDOMNode类 IXMLDOMNode类描述了一个节点,该类提供了一系列用于搜索和操纵XML文档的属性和方法。 selectSingleNode 方法用于搜索指定节点的后代,用于搜索指定节点路径的语言称为XPATH,XPATH非常棘手,本文就不详细说明其规范了。下面我们将介绍两个对搜索子节点有特别有用并且简单的方法。 在给selectsingleNode方法中输入子节点的名字,该方法将在节点的子节点进行精确匹配搜索。如果在输入的字符串前面加上".//",那么将搜索节点的全部后代。' Search for a child node named "LastName." Set last_name_node = address_node.selectSingleNode("LastName")' Search for any descendant named "LastName." Set last_name_node = address_node.selectSingleNode(".//LastName") 下面列出了IXMLDOMNode对象的部分非常有用的属性: attributes.节点属性集合 nodeName.节点的标记名 nodeTypeString.节点的类型 ownerDocument.返回DOMDocument对象包含的节点 text.表示节点包含的文本内容。如果该节点包含其他节点,那么text代表了所有节点的文本内容的组合。 xml.给出了节点的xml内容,例如:"<FirstName>Rod</FirstName>". ChildNodes集合包含了节点的子节点。要给节点增加一个子节点,首先必须给使用DOMDocument对象的节点创建方法,然后将这个新建的节点加入到父节点的childNodes集合中。下面的代码展示了创建一个新的子节点的子程序,并使用父节点的appendChild方法将其加入到父节点中:' Add a new node to the indicated parent node. Private Sub CreateNode(ByVal indent As Integer, _ ByVal parent As IXMLDOMNode, ByVal node_name As String, _ ByVal node_value As String) Dim new_node As IXMLDOMNode' Create the new node. Set new_node = parent.ownerDocument.createElement(node_name)' Set the node's text value. new_node.Text = node_value' Add the node to the parent. parent.appendChild new_node End Sub SaveValues 程序 现在我们可以使用XML创建一个简单的程序(如图1),其值存储到XML文件中,在程序开始运行时,程序从VALUE.XML文件中加载数据,在程序运行结束时,将程序中的现行值存入VALUE.XML文件中。 下面的代码是显示了VALUE.XML文件的结构:<Values> <FirstName>Rod</FirstName> <LastName>Stephens</LastName> <Street>1234 Programmer Place</Street> <City>Bugsville</City> <State>CO</State> <Zip>80276</Zip> </Values> List1显示了怎样编写SaveValues,当载入表单时,form_load事件触发LoadValues子程序。 LoadValues创建了一个名为xml_document的DOMDocument对象,然后载入xml文件,使用selectSingleNode方法查找名为values的节点,然后使用GetNodeValue方法获得从value节点后代中得到的值。 GetNodeValue使用value节点的selectSingleNode方法寻找目标节点,如果节点不存在函数将返回一个缺省值,如果找到这个节点GetNodeValue将返回该节点的text值。对于value.xml文件中的数据节点,text仅仅是包含在节点中的文本内容。 当窗体卸载时触发form_unload事件,unload事件调用SaveValues子程序。程序创建一个新的DOMDocument对象,该对象创建一个新的名为value的节点,然后用文档的appendChild方法将节点添加到文档中。 在创建所有新的节点后,SaveValues调用DOMDocument's save方法存储新的xml文件。 注意这个新的文件已经覆盖了旧文件,使用DOMDocument对象无法部分改变XML文件,可以加载XML文件,然后修改其中一部分,然后保存文件,但原文件将被完全覆盖。这是一个小的缺陷,但在这时可以使用其它程序进行修改。 List1的最后一部分是CreateNode子程序,CreateNode 为父节点创建一个新节点并同时给这个节点赋值。在这个子程序中首先引用一个DOMDocument对象,然后使用该对象的createElement方法创建一个新的节点。 createNode方法设置节点的text属性,然后将节点作为子节点添加到父节点中。List1:Option ExplicitPrivate m_AppPath As StringPrivate Sub Form_Load() ' Get the application's startup path. m_AppPath = App.Path If Right$(m_AppPath, 1) <> "\" Then m_AppPath = m_AppPath & "\"' Load the values. LoadValues End SubPrivate Sub Form_Unload(Cancel As Integer) ' Save the current values. SaveValues End Sub' Load saved values from XML. Private Sub LoadValues() Dim xml_document As DOMDocument Dim values_node As IXMLDOMNode' Load the document. Set xml_document = New DOMDocument xml_document.Load m_AppPath & "Values.xml"' If the file doesn't exist, then ' xml_document.documentElement is Nothing. If xml_document.documentElement Is Nothing Then ' The file doesn't exist. Do nothing. Exit Sub End If' Find the Values section. Set values_node = xml_document.selectSingleNode("Values")' Read the saved values. txtFirstName.Text = GetNodeValue(values_node, "FirstName", "???") txtLastName.Text = GetNodeValue(values_node, "LastName", "???") txtStreet.Text = GetNodeValue(values_node, "Street", "???") txtCity.Text = GetNodeValue(values_node, "City", "???") txtState.Text = GetNodeValue(values_node, "State", "???") txtZip.Text = GetNodeValue(values_node, "Zip", "???") End Sub' Return the node's value. Private Function GetNodeValue(ByVal start_at_node As IXMLDOMNode, _ ByVal node_name As String, _ Optional ByVal default_value As String = "") As String Dim value_node As IXMLDOMNodeSet value_node = start_at_node.selectSingleNode(".//" & node_name) If value_node Is Nothing Then GetNodeValue = default_value Else GetNodeValue = value_node.Text End If End Function' Save the current values. Private Sub SaveValues() Dim xml_document As DOMDocument Dim values_node As IXMLDOMNode' Create the XML document. Set xml_document = New DOMDocument' Create the Values section node. Set values_node = xml_document.createElement("Values")' Add the Values section node to the document. xml_document.appendChild values_node' Create nodes for the values inside the ' Values section node. CreateNode values_node, "FirstName", txtFirstName.Text CreateNode values_node, "LastName", txtLastName.Text CreateNode values_node, "Street", txtStreet.Text CreateNode values_node, "City", txtCity.Text CreateNode values_node, "State", txtState.Text CreateNode values_node, "Zip", txtZip.Text' Save the XML document. xml_document.save m_AppPath & "Values.xml" End Sub' Add a new node to the indicated parent node. Private Sub CreateNode(ByVal parent As IXMLDOMNode, _ ByVal node_name As String, ByVal node_value As String) Dim new_node As IXMLDOMNode' Create the new node. Set new_node = parent.ownerDocument.createElement(node_name)' Set the node's text value. new_node.Text = node_value' Add the node to the parent. parent.appendChild new_node End Sub
SaveValuesIndented 程序 虽然每个人都化了很大的精力去处理xml文档,使他们看上更容易些,但xml工具一般都忽略了那些使xml文档结构明显的空白和缩进,xml解析器也同样忽略缩进和空白。 不幸的是我们例子也同样忽略了这些缩进和空白,SaveValues创建了一个象下面那样的xml文件,所有的代码都在同一行中。<Values><FirstName>Rod</FirstName><LastName>Stephens</LastNa me><Street>1234 Programmer Place</Street><City>Bugsville</Ci ty><State>CO</State><Zip>80276</Zip></Values> VB.NET中包括了文本写入类,可以XML文档规定格式。但MSXML重没有这种功能,所以如果需要以一种清晰的格式保存XML文件,只能另行添加它的格式。 List2列出了程序SaveValuesIndented使用的代码,SaveValues子程序与上面例子中讲的几乎完全相同,但他在创建value节点后同时给XML文档创建了一个<value>标记的新行。 然后SaveValues 调用CreateNode创建一个新的数据节点,但在这里它传递给CreateNode一个新的参数,这个参数表示这个新节点的缩进方式。CreateNode ' Save the current values. Private Sub SaveValues() Dim xml_document As DOMDocument Dim values_node As IXMLDOMNode' Create the XML document. Set xml_document = New DOMDocument' Create the Values section node. Set values_node = xml_document.createElement("Values")' Add a new line. values_node.appendChild xml_document.createTextNode(vbCrLf)' Add the Values section node to the document. xml_document.appendChild values_node' Create nodes for the values inside the ' Values section node. CreateNode 4, values_node, "FirstName", txtFirstName.Text CreateNode 4, values_node, "LastName", txtLastName.Text CreateNode 4, values_node, "Street", txtStreet.Text CreateNode 4, values_node, "City", txtCity.Text CreateNode 4, values_node, "State", txtState.Text CreateNode 4, values_node, "Zip", txtZip.Text' Save the XML document. xml_document.save m_AppPath & "Values.xml" End Sub' Add a new node to the indicated parent node. Private Sub CreateNode(ByVal indent As Integer, _ ByVal parent As IXMLDOMNode, ByVal node_name As String, _ ByVal node_value As String) Dim new_node As IXMLDOMNode' Indent. parent.appendChild _ parent.ownerDocument.createTextNode(Space$(indent))' Create the new node. Set new_node = parent.ownerDocument.createElement(node_name)' Set the node's text value. new_node.Text = node_value' Add the node to the parent. parent.appendChild new_node' Add a new line. parent.appendChild parent.ownerDocument.createTextNode(vbCrLf) End Sub 结论 本文仅仅揭示XML编程的表面,本文的例子中的涉及只是非常简单的XML文件,但你可以使用使用本文揭示的技术做更多的事情,比如配置设置、表单位置、以及其他信息。XML已经向前更进一步的发展了,有了更复杂的数据层次。对于更复杂的数据结构,在运行时可以更容易的使用MSXML对象来存取XML文件
写XML的方法:Sub test() Dim iRe As ADODB.Recordset
Set iRe = New ADODB.Recordset With iRe .Fields.Append "Remote Server", adVarChar, 128 .Fields.Append "Remote UID", adVarChar, 128 .Fields.Append "Remote PWD", adVarChar, 128 .Open .AddNew .Fields("Remote Server") = "aa" .Fields("Remote UID") = "sa" .Fields("Remote PWD") = "" .Update .Save "c:\aa.xml", adPersistXML End With End Sub
读出上面写的,并增加记录的方法: Sub test() Dim iRe As ADODB.Recordset
Set iRe = New ADODB.Recordset With iRe .Open "c:\aa.xml" .AddNew .Fields("Remote Server") = "bb" .Fields("Remote UID") = "sa" .Fields("Remote PWD") = "" .Update .Save "c:\aa.xml", adPersistXML End With End Sub
装载XML文档
新建一个VB Standard EXE工程项目。在Form1中添加一个CommandButton控件,将其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 Basic的For Each...Next循环结构在节点对象集合中循环。在cmdLoad_Click事件代码后添加下列代码:
Dim node As IXMLDOMNode
For Each node In root.childNodes
Debug.Print 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.Print node.selectSingleNode
(“离站时间").Text & “——"
&node.selectSingleNode (“到站时间").Text
Next
这段代码使用selectNodes方法选择根节点下所有的“航班”节点,然后使用selectSingleNode方法选择“航班”节点下的“离站时间”和“到站时间”,读取并打印它们的Text属性值。
可以使用childNodes集合以递归的方式层次化显示XML 文档的内容。
首先,在Form1中声明一个子过程PrettyPrint。
Public Sub PrettyPrint(node As IXMLDOMNode,
Optional tabLevel As Integer=0)
Dim childNode As IXMLDOMNode
If node.nodeName<>vbNullStrin
And node.nodeName < >“#text" Then
Debug.PrintString(tabLevel,Chr$(9))
&“< "&node.nodeName&“ >"
End If
If node.hasChildNodes Then
For Each childNode In node.childNodes
Call PrettyPrint(childNode,tabLevel+1)
Next
Else
Debug.PrintString(tabLevel+1,Chr$(9))&node.Text
End If
If node.nodeName< >vbNullString And node.nodeName
< >“#text" Then
Debug.PrintString
(tabLevel,Chr$(9))&“< /"&node.nodeName&“ >"
End If
End Sub
然后在Form1中加入第2个CommandButton控件,将其 Name和Caption属性分别设为cmdPrint和Print。将下列代码加入事件cmdPrint_Click中:
Private Sub cmdPrint_Click()
If Not xml Is Nothing Then
Call PrettyPrint
(xml.documentElement)
End If
End Sub
运行程序。首先点击Load XML按钮加载flight.xml,然后点击Print按钮。在Immediate窗口中可以看到层次分明、易于阅读的输出结果。子过程 PrettyPrint在documentElement的子节点中循环,打印每个节点的nodeName属性值,而每个子节点又递归调用PrettyPrint。XML文档内各节点内在的相似性是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文档保存为文件、数据流或ASP的Response对象。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编程来操纵它。
"<Person>" & vbCrLf & _
" <FirstName>Rod</FirstName>" & vbCrLf & _
" <LastName>Stephens</LastName>" & vbCrLf & _
"</Person>"
DOMDocument的xml属性返回文档的xml描述,可以显示这些返回值看看这些文档究竟是什么样子,也可以将它存储为一个文件,但这完全不必要,因为DOMDocument对象的save方法已经自动将他们存储了。 DOMDocument对象的documentElement属性表示文档数据的根结点,通常情况下操作XML文档都从这里开始。 DOMDocument提供了几种创建新节点的方法。CreateElement方法为文档创建一个新的元素节点,其他创建节点的方法有createAttribute, createProcessingInstruction, 和 createTextNode,在这里就不一一介绍了。 IXMLDOMNode类 IXMLDOMNode类描述了一个节点,该类提供了一系列用于搜索和操纵XML文档的属性和方法。
selectSingleNode 方法用于搜索指定节点的后代,用于搜索指定节点路径的语言称为XPATH,XPATH非常棘手,本文就不详细说明其规范了。下面我们将介绍两个对搜索子节点有特别有用并且简单的方法。 在给selectsingleNode方法中输入子节点的名字,该方法将在节点的子节点进行精确匹配搜索。如果在输入的字符串前面加上".//",那么将搜索节点的全部后代。' Search for a child node named "LastName."
Set last_name_node = address_node.selectSingleNode("LastName")' Search for any descendant named "LastName."
Set last_name_node = address_node.selectSingleNode(".//LastName") 下面列出了IXMLDOMNode对象的部分非常有用的属性: attributes.节点属性集合 nodeName.节点的标记名 nodeTypeString.节点的类型 ownerDocument.返回DOMDocument对象包含的节点 text.表示节点包含的文本内容。如果该节点包含其他节点,那么text代表了所有节点的文本内容的组合。 xml.给出了节点的xml内容,例如:"<FirstName>Rod</FirstName>". ChildNodes集合包含了节点的子节点。要给节点增加一个子节点,首先必须给使用DOMDocument对象的节点创建方法,然后将这个新建的节点加入到父节点的childNodes集合中。下面的代码展示了创建一个新的子节点的子程序,并使用父节点的appendChild方法将其加入到父节点中:' Add a new node to the indicated parent node.
Private Sub CreateNode(ByVal indent As Integer, _
ByVal parent As IXMLDOMNode, ByVal node_name As String, _
ByVal node_value As String)
Dim new_node As IXMLDOMNode' Create the new node.
Set new_node = parent.ownerDocument.createElement(node_name)' Set the node's text value.
new_node.Text = node_value' Add the node to the parent.
parent.appendChild new_node
End Sub
SaveValues 程序 现在我们可以使用XML创建一个简单的程序(如图1),其值存储到XML文件中,在程序开始运行时,程序从VALUE.XML文件中加载数据,在程序运行结束时,将程序中的现行值存入VALUE.XML文件中。 下面的代码是显示了VALUE.XML文件的结构:<Values>
<FirstName>Rod</FirstName>
<LastName>Stephens</LastName>
<Street>1234 Programmer Place</Street>
<City>Bugsville</City>
<State>CO</State>
<Zip>80276</Zip>
</Values> List1显示了怎样编写SaveValues,当载入表单时,form_load事件触发LoadValues子程序。
LoadValues创建了一个名为xml_document的DOMDocument对象,然后载入xml文件,使用selectSingleNode方法查找名为values的节点,然后使用GetNodeValue方法获得从value节点后代中得到的值。 GetNodeValue使用value节点的selectSingleNode方法寻找目标节点,如果节点不存在函数将返回一个缺省值,如果找到这个节点GetNodeValue将返回该节点的text值。对于value.xml文件中的数据节点,text仅仅是包含在节点中的文本内容。 当窗体卸载时触发form_unload事件,unload事件调用SaveValues子程序。程序创建一个新的DOMDocument对象,该对象创建一个新的名为value的节点,然后用文档的appendChild方法将节点添加到文档中。 在创建所有新的节点后,SaveValues调用DOMDocument's save方法存储新的xml文件。 注意这个新的文件已经覆盖了旧文件,使用DOMDocument对象无法部分改变XML文件,可以加载XML文件,然后修改其中一部分,然后保存文件,但原文件将被完全覆盖。这是一个小的缺陷,但在这时可以使用其它程序进行修改。 List1的最后一部分是CreateNode子程序,CreateNode 为父节点创建一个新节点并同时给这个节点赋值。在这个子程序中首先引用一个DOMDocument对象,然后使用该对象的createElement方法创建一个新的节点。 createNode方法设置节点的text属性,然后将节点作为子节点添加到父节点中。List1:Option ExplicitPrivate m_AppPath As StringPrivate Sub Form_Load()
' Get the application's startup path.
m_AppPath = App.Path
If Right$(m_AppPath, 1) <> "\" Then m_AppPath = m_AppPath & "\"' Load the values.
LoadValues
End SubPrivate Sub Form_Unload(Cancel As Integer)
' Save the current values.
SaveValues
End Sub' Load saved values from XML.
Private Sub LoadValues()
Dim xml_document As DOMDocument
Dim values_node As IXMLDOMNode' Load the document.
Set xml_document = New DOMDocument
xml_document.Load m_AppPath & "Values.xml"' If the file doesn't exist, then
' xml_document.documentElement is Nothing.
If xml_document.documentElement Is Nothing Then
' The file doesn't exist. Do nothing.
Exit Sub
End If' Find the Values section.
Set values_node = xml_document.selectSingleNode("Values")' Read the saved values.
txtFirstName.Text = GetNodeValue(values_node, "FirstName", "???")
txtLastName.Text = GetNodeValue(values_node, "LastName", "???")
txtStreet.Text = GetNodeValue(values_node, "Street", "???")
txtCity.Text = GetNodeValue(values_node, "City", "???")
txtState.Text = GetNodeValue(values_node, "State", "???")
txtZip.Text = GetNodeValue(values_node, "Zip", "???")
End Sub' Return the node's value.
Private Function GetNodeValue(ByVal start_at_node As IXMLDOMNode, _
ByVal node_name As String, _
Optional ByVal default_value As String = "") As String
Dim value_node As IXMLDOMNodeSet value_node = start_at_node.selectSingleNode(".//" & node_name)
If value_node Is Nothing Then
GetNodeValue = default_value
Else
GetNodeValue = value_node.Text
End If
End Function' Save the current values.
Private Sub SaveValues()
Dim xml_document As DOMDocument
Dim values_node As IXMLDOMNode' Create the XML document.
Set xml_document = New DOMDocument' Create the Values section node.
Set values_node = xml_document.createElement("Values")' Add the Values section node to the document.
xml_document.appendChild values_node' Create nodes for the values inside the
' Values section node.
CreateNode values_node, "FirstName", txtFirstName.Text
CreateNode values_node, "LastName", txtLastName.Text
CreateNode values_node, "Street", txtStreet.Text
CreateNode values_node, "City", txtCity.Text
CreateNode values_node, "State", txtState.Text
CreateNode values_node, "Zip", txtZip.Text' Save the XML document.
xml_document.save m_AppPath & "Values.xml"
End Sub' Add a new node to the indicated parent node.
Private Sub CreateNode(ByVal parent As IXMLDOMNode, _
ByVal node_name As String, ByVal node_value As String)
Dim new_node As IXMLDOMNode' Create the new node.
Set new_node = parent.ownerDocument.createElement(node_name)' Set the node's text value.
new_node.Text = node_value' Add the node to the parent.
parent.appendChild new_node
End Sub
me><Street>1234 Programmer Place</Street><City>Bugsville</Ci
ty><State>CO</State><Zip>80276</Zip></Values> VB.NET中包括了文本写入类,可以XML文档规定格式。但MSXML重没有这种功能,所以如果需要以一种清晰的格式保存XML文件,只能另行添加它的格式。 List2列出了程序SaveValuesIndented使用的代码,SaveValues子程序与上面例子中讲的几乎完全相同,但他在创建value节点后同时给XML文档创建了一个<value>标记的新行。 然后SaveValues 调用CreateNode创建一个新的数据节点,但在这里它传递给CreateNode一个新的参数,这个参数表示这个新节点的缩进方式。CreateNode
' Save the current values.
Private Sub SaveValues()
Dim xml_document As DOMDocument
Dim values_node As IXMLDOMNode' Create the XML document.
Set xml_document = New DOMDocument' Create the Values section node.
Set values_node = xml_document.createElement("Values")' Add a new line.
values_node.appendChild xml_document.createTextNode(vbCrLf)' Add the Values section node to the document.
xml_document.appendChild values_node' Create nodes for the values inside the
' Values section node.
CreateNode 4, values_node, "FirstName", txtFirstName.Text
CreateNode 4, values_node, "LastName", txtLastName.Text
CreateNode 4, values_node, "Street", txtStreet.Text
CreateNode 4, values_node, "City", txtCity.Text
CreateNode 4, values_node, "State", txtState.Text
CreateNode 4, values_node, "Zip", txtZip.Text' Save the XML document.
xml_document.save m_AppPath & "Values.xml"
End Sub' Add a new node to the indicated parent node.
Private Sub CreateNode(ByVal indent As Integer, _
ByVal parent As IXMLDOMNode, ByVal node_name As String, _
ByVal node_value As String)
Dim new_node As IXMLDOMNode' Indent.
parent.appendChild _
parent.ownerDocument.createTextNode(Space$(indent))' Create the new node.
Set new_node = parent.ownerDocument.createElement(node_name)' Set the node's text value.
new_node.Text = node_value' Add the node to the parent.
parent.appendChild new_node' Add a new line.
parent.appendChild parent.ownerDocument.createTextNode(vbCrLf)
End Sub
结论 本文仅仅揭示XML编程的表面,本文的例子中的涉及只是非常简单的XML文件,但你可以使用使用本文揭示的技术做更多的事情,比如配置设置、表单位置、以及其他信息。XML已经向前更进一步的发展了,有了更复杂的数据层次。对于更复杂的数据结构,在运行时可以更容易的使用MSXML对象来存取XML文件
Dim iRe As ADODB.Recordset
Set iRe = New ADODB.Recordset
With iRe
.Fields.Append "Remote Server", adVarChar, 128
.Fields.Append "Remote UID", adVarChar, 128
.Fields.Append "Remote PWD", adVarChar, 128
.Open
.AddNew
.Fields("Remote Server") = "aa"
.Fields("Remote UID") = "sa"
.Fields("Remote PWD") = ""
.Update
.Save "c:\aa.xml", adPersistXML
End With
End Sub
Sub test()
Dim iRe As ADODB.Recordset
Set iRe = New ADODB.Recordset
With iRe
.Open "c:\aa.xml"
.AddNew
.Fields("Remote Server") = "bb"
.Fields("Remote UID") = "sa"
.Fields("Remote PWD") = ""
.Update
.Save "c:\aa.xml", adPersistXML
End With
End Sub