<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>XML技术</title><link>http://blog.vckbase.com/jim97/category/788.html</link><description>XML技术</description><managingEditor>木子的blog</managingEditor><dc:language>zh-CHS</dc:language><generator>.Text Version 0.958.2004.214</generator><item><dc:creator>木子的blog</dc:creator><title>在Visual Basic 6.0中操纵XML文件</title><link>http://blog.vckbase.com/jim97/articles/12099.html</link><pubDate>Wed, 14 Sep 2005 08:03:00 GMT</pubDate><guid>http://blog.vckbase.com/jim97/articles/12099.html</guid><wfw:comment>http://blog.vckbase.com/jim97/comments/12099.html</wfw:comment><comments>http://blog.vckbase.com/jim97/articles/12099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/jim97/comments/commentRss/12099.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/jim97/services/trackbacks/12099.html</trackback:ping><description>&lt;STRONG&gt;&lt;FONT color=#ac0000&gt;什么是XML&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;　　扩展标记语言XML是一种简单的数据存储语言，使用一系列简单的标记描述数据，而这些标记可以用方便的方式建立，虽然XML占用的空间比二进制数据要占用更多的空间，但XML极其简单易于掌握和使用。 &lt;BR&gt;　　XML与Access,Oracle和SQL Server等数据库不同，数据库提供了更强有力的数据存储和分析能力，例如：数据索引、排序、查找、相关一致性等，XML仅仅是展示数据。事实上XML与其他数据表现形式最大的不同是：他极其简单。这是一个看上去有点琐细的优点，但正是这点使XML与众不同。&lt;BR&gt;&lt;BR&gt;　　XML的简单使其易于在任何应用程序中读写数据，这使XML很快成为数据交换的唯一公共语言，虽然不同的应用软件也支持其它的数据交换格式，但不久之后他们都将支持XML，那就意味着程序可以更容易的与Windows、Mac OS, Linux以及其他平台下产生的信息结合，然后可以很容易加载XML数据到程序中并分析他，并以XML格式输出结果。&lt;BR&gt;&lt;BR&gt;　　&lt;FONT color=#ac000&gt;&lt;B&gt;XML的优点&lt;/B&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;　　我们谈到XML长于在不同的应用程序之间交换数据，XML文件也便于构建小的数据库，不久以前，软件都使用INI文件存储配置信息、用户参数以及其他信息，后来微软引入了系统注册表，接作微软告诉我们不应该再使用INI文件了，从那时起Visual Basic对INI文件的支持被削弱了。但不幸的是注册表有几个致命的缺点：不是简单的文本文件，难于读写、可能会变得庞大和缓慢、如果注册表不知何故出现问题，将有可能造成系统死机。&lt;BR&gt;&lt;BR&gt;　　将配置信息放在XML文件中可以避免这些问题，甚至可以将XML文件设置为一个共享文件，这样在不同的计算机上的用户就可以共享数据，这是注册表所不能比拟的。&lt;BR&gt;&lt;BR&gt;　　在被称为下一代ASP的ASP.NET中可以在WEB页中直接使用XML，你可以使用数据绑定控件直接绑定数据并自动显示。&lt;BR&gt;&lt;BR&gt;　　当然也可以不选择XML，使用文本文件、注册表、数据库都可以完成XML所能完成的任务，XML只是你在数据存储和恢复的另一种工具而已。&lt;BR&gt;&lt;BR&gt;　　&lt;FONT color=#ac000&gt;&lt;B&gt;XML语法简介&lt;/B&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;　　XML的语法非常的简单，XML文档由节点组成，使用打开和关闭节点描述标记，在格式上与HTML标记非常相似，它们之间最大的不同是：XML中可以自由定义标记名。比如下面的标记就描述了一个电话号码：&lt;BR&gt;&lt;BR&gt;　　＜Phone＞987-654-3210＜/Phone＞&lt;BR&gt;&lt;BR&gt;　　而且不用声明标记名就可以使用。&lt;BR&gt;&lt;BR&gt;　　开始和结束标记必须相同，XML是识别大小写的，所以标记的大小写也必须相同。比如上面的例子中以＜Phone＞标记开始就必须以＜/Phone＞标记结束，而不能是＜/phone＞或＜/PHONE＞&lt;BR&gt;&lt;BR&gt;　　节点标记中可以包含属性，比如下面的代码中Phone节点包含属性Type，其值为WorkFax:&lt;BR&gt;&lt;BR&gt;　　＜Phone Type="WorkFax"＞987-654-3210＜Phone＞&lt;BR&gt;&lt;BR&gt;　　如果不愿意在节点中包含一个值，那么可以不需要结束标记，可以用在开始标记的后面加一个斜线来结束节点，在下面的例子中，Phone标记的Number属性就存储了一个电话号码，所以就不需要一个结束标记：&lt;BR&gt;&lt;BR&gt;　　＜Phone Type="WorkFax" Number="987-654-3210" /＞&lt;BR&gt;&lt;BR&gt;　　XML文档的结构是一个树形等级结构。文档必须有一个唯一的根结点，根节点包含所有其它节点。下面我们举一个较为完整的例子：&lt;BR&gt;&lt;BR&gt;
&lt;TABLE width="100%" bgColor=#ffffff&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;＜Addresses＞&lt;BR&gt;　＜Entry Type="Personal"＞&lt;BR&gt;　　＜FirstName＞Andy＜/FirstName＞&lt;BR&gt;　　＜LastName＞Fickle＜/LastName＞&lt;BR&gt;　　＜Street＞1234 Programmer Place＜/Street＞&lt;BR&gt;　　＜City＞Bugsville＜/City＞&lt;BR&gt;　　＜State＞CO＜/State＞&lt;BR&gt;　　＜Zip＞82379＜/Zip＞&lt;BR&gt;　　＜Phone Type="Home"＞354-493-9489＜/Phone＞&lt;BR&gt;　＜/Entry＞&lt;BR&gt;　＜Entry Type="Work"＞&lt;BR&gt;　　＜FirstName＞Betty＜/FirstName＞&lt;BR&gt;　　＜LastName＞Masterson＜/LastName＞&lt;BR&gt;　　＜Phone Type="Work"＞937-878-4958＜/Phone＞&lt;BR&gt;　　＜Phone Type="WorkFax"＞937-878-4900＜/Phone＞&lt;BR&gt;　＜/Entry＞&lt;BR&gt;　...&lt;BR&gt;＜/Addresses＞&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;　　注意相似的节点不需要包含相同的信息，例如第一个Entry节点包含了地址信息和家庭电话号码，第二个Entry节点包含了Work和WorkFax电话号码，而没有包含第一个Entry节点包含的信息。&lt;BR&gt;&lt;BR&gt;　　&lt;B&gt;&lt;FONT color=#ac000&gt;XML工具&lt;/FONT&gt;&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;　　如前面的例子显示，XML语法是如此的简单以至于你可以在很短的时间作一个XML解析器，幸运的是你不必这样做，因为XML工具可以运行在各种平台上，包括可以安装了Visual Basic的Windows。&lt;BR&gt;&lt;BR&gt;　　正是这些L工具而不是XML本身使XML变得更强大和复杂。不同的解析器使你可以某一时刻加载整个XML文档或只加载某个节点，与此相反，XML Writer 可以同时创建一个XML文档和节点。&lt;BR&gt;&lt;BR&gt;　　DOM解析器使我们能够很方便的加载、复制、排序、修改和存储XML文件，遍历节点获得名称或属性，并给结果排序。虽然他们的功能没有真正的关系数据库强大，但DOM的这些特点依然非常有用。&lt;BR&gt;&lt;BR&gt;　　XSD可以定义XML文档的格式，XSL扩展样式单定义了怎样将XML文档转换成其他可以在WEB浏览器中浏览的文件格式，比如HTML文件。&lt;BR&gt;&lt;BR&gt;　　这些工具实际上比XML本身更复杂，所以所有讲解XML的书籍都花了很大的篇幅解释这些XML工具。但这超出了本文的范围，有兴趣的读者可以参考有关资料。&lt;BR&gt;&lt;BR&gt;　　Visual Basic.Net提供了使用XML、XSL以及其他XML工具的完整工具。但不用等待VB.NET，微软XML核心服务（MSXML）版本4.0提供了从Visual Basic6.0加载和存储XML文档的工具。&lt;BR&gt;&lt;BR&gt;　　在msdn.microsoft.com/xml/default.asp中下载最新版本的MSXML，并安装在计算机上。在Visual Basic 6.0中使用Microsoft XML V4.0象引用其他对象一样，首先在工程菜单中选择引用菜单项，选择Microsoft V4.0,单击OK,一切完成后就现在就可以在VB应用程序中添加XML对象了。&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT color=#ac0000&gt;DOMDocument 类&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;　　文档对象模型(DOM)使用了一系列相应的对象描述了XML文档的等级状态，DOMDocument类是一个描绘XML文档的DOM结构的MSXML类。&lt;BR&gt;&lt;BR&gt;　　DOMDocument类仅仅提供了很少的几个有用的属性和方法。Load方法载入一个xml文件，loadxml方法将字符串作为xml数据添加到对象中。例如，下面的代码就将一个小的xml文件添加到名为xml_document的文档中。&lt;BR&gt;&lt;BR&gt;
&lt;TABLE width="100%" bgColor=#ffffff&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;Dim xml_document As New DOMDocument&lt;BR&gt;&lt;BR&gt;xml_document.loadXML _&lt;BR&gt;"＜Person＞" &amp;amp; vbCrLf &amp;amp; _&lt;BR&gt;" ＜FirstName＞Rod＜/FirstName＞" &amp;amp; vbCrLf &amp;amp; _&lt;BR&gt;" ＜LastName＞Stephens＜/LastName＞" &amp;amp; vbCrLf &amp;amp; _&lt;BR&gt;"＜/Person＞"&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;　　DOMDocument的xml属性返回文档的xml描述，可以显示这些返回值看看这些文档究竟是什么样子，也可以将它存储为一个文件，但这完全不必要，因为DOMDocument对象的save方法已经自动将他们存储了。&lt;BR&gt;&lt;BR&gt;　　DOMDocument对象的documentElement属性表示文档数据的根结点，通常情况下操作XML文档都从这里开始。&lt;BR&gt;&lt;BR&gt;　　DOMDocument提供了几种创建新节点的方法。CreateElement方法为文档创建一个新的元素节点，其他创建节点的方法有createAttribute, createProcessingInstruction, 和 createTextNode，在这里就不一一介绍了。&lt;BR&gt;&lt;BR&gt;　　&lt;B&gt;&lt;FONT color=#ac000&gt;IXMLDOMNode类&lt;/FONT&gt;&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;　　IXMLDOMNode类描述了一个节点，该类提供了一系列用于搜索和操纵XML文档的属性和方法。&lt;BR&gt;selectSingleNode 方法用于搜索指定节点的后代，用于搜索指定节点路径的语言称为XPATH，XPATH非常棘手，本文就不详细说明其规范了。下面我们将介绍两个对搜索子节点有特别有用并且简单的方法。&lt;BR&gt;&lt;BR&gt;　　在给selectsingleNode方法中输入子节点的名字，该方法将在节点的子节点进行精确匹配搜索。如果在输入的字符串前面加上".//"，那么将搜索节点的全部后代。&lt;BR&gt;&lt;BR&gt;
&lt;TABLE width="100%" bgColor=#ffffff&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;' Search for a child node named "LastName."&lt;BR&gt;Set last_name_node = address_node.selectSingleNode("LastName")&lt;BR&gt;&lt;BR&gt;' Search for any descendant named "LastName."&lt;BR&gt;Set last_name_node = address_node.selectSingleNode(".//LastName")&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;　　下面列出了IXMLDOMNode对象的部分非常有用的属性：&lt;BR&gt;&lt;BR&gt;　　　attributes.节点属性集合&lt;BR&gt;&lt;BR&gt;　　　nodeName.节点的标记名&lt;BR&gt;&lt;BR&gt;　　　nodeTypeString.节点的类型&lt;BR&gt;&lt;BR&gt;　　　ownerDocument.返回DOMDocument对象包含的节点&lt;BR&gt;&lt;BR&gt;　　　text.表示节点包含的文本内容。如果该节点包含其他节点，那么text代表了所有节点的文本内容的组合。&lt;BR&gt;&lt;BR&gt;　　　xml.给出了节点的xml内容，例如："＜FirstName＞Rod＜/FirstName＞".&lt;BR&gt;&lt;BR&gt;　　ChildNodes集合包含了节点的子节点。要给节点增加一个子节点，首先必须给使用DOMDocument对象的节点创建方法，然后将这个新建的节点加入到父节点的childNodes集合中。下面的代码展示了创建一个新的子节点的子程序，并使用父节点的appendChild方法将其加入到父节点中：&lt;BR&gt;&lt;BR&gt;
&lt;TABLE width="100%" bgColor=#ffffff&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;' Add a new node to the indicated parent node.&lt;BR&gt;Private Sub CreateNode(ByVal indent As Integer, _&lt;BR&gt;ByVal parent As IXMLDOMNode, ByVal node_name As String, _&lt;BR&gt;ByVal node_value As String)&lt;BR&gt;Dim new_node As IXMLDOMNode&lt;BR&gt;&lt;BR&gt;' Create the new node.&lt;BR&gt;Set new_node = parent.ownerDocument.createElement(node_name)&lt;BR&gt;&lt;BR&gt;' Set the node's text value.&lt;BR&gt;new_node.Text = node_value&lt;BR&gt;&lt;BR&gt;' Add the node to the parent.&lt;BR&gt;parent.appendChild new_node&lt;BR&gt;End Sub&lt;BR&gt;SaveValues 程序&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;　　现在我们可以使用XML创建一个简单的程序（如图1），其值存储到XML文件中，在程序开始运行时，程序从VALUE.XML文件中加载数据，在程序运行结束时，将程序中的现行值存入VALUE.XML文件中。&lt;BR&gt;&lt;BR&gt;
&lt;TABLE width=600&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;IMG height=159 src="http://www.yesky.com/20021016/jt-2002-10-17-image001.gif" width=232&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;　　下面的代码是显示了VALUE.XML文件的结构:&lt;BR&gt;&lt;BR&gt;
&lt;TABLE width="100%" bgColor=#ffffff&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;＜Values＞&lt;BR&gt;　＜FirstName＞Rod＜/FirstName＞&lt;BR&gt;　＜LastName＞Stephens＜/LastName＞&lt;BR&gt;　＜Street＞1234 Programmer Place＜/Street＞&lt;BR&gt;　＜City＞Bugsville＜/City＞&lt;BR&gt;　＜State＞CO＜/State＞&lt;BR&gt;　＜Zip＞80276＜/Zip＞&lt;BR&gt;＜/Values＞&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;　　List1显示了怎样编写SaveValues，当载入表单时，form_load事件触发LoadValues子程序。&lt;BR&gt;LoadValues创建了一个名为xml_document的DOMDocument对象，然后载入xml文件，使用selectSingleNode方法查找名为values的节点，然后使用GetNodeValue方法获得从value节点后代中得到的值。&lt;BR&gt;&lt;BR&gt;　　GetNodeValue使用value节点的selectSingleNode方法寻找目标节点，如果节点不存在函数将返回一个缺省值，如果找到这个节点GetNodeValue将返回该节点的text值。对于value.xml文件中的数据节点，text仅仅是包含在节点中的文本内容。&lt;BR&gt;&lt;BR&gt;　　当窗体卸载时触发form_unload事件，unload事件调用SaveValues子程序。程序创建一个新的DOMDocument对象，该对象创建一个新的名为value的节点，然后用文档的appendChild方法将节点添加到文档中。&lt;BR&gt;&lt;BR&gt;　　在创建所有新的节点后，SaveValues调用DOMDocument's save方法存储新的xml文件。&lt;BR&gt;&lt;BR&gt;　　注意这个新的文件已经覆盖了旧文件，使用DOMDocument对象无法部分改变XML文件，可以加载XML文件，然后修改其中一部分，然后保存文件，但原文件将被完全覆盖。这是一个小的缺陷，但在这时可以使用其它程序进行修改。&lt;BR&gt;&lt;BR&gt;　　List1的最后一部分是CreateNode子程序，CreateNode 为父节点创建一个新节点并同时给这个节点赋值。在这个子程序中首先引用一个DOMDocument对象，然后使用该对象的createElement方法创建一个新的节点。&lt;BR&gt;&lt;BR&gt;　　createNode方法设置节点的text属性，然后将节点作为子节点添加到父节点中。&lt;BR&gt;&lt;BR&gt;List1:&lt;BR&gt;&lt;BR&gt;
&lt;TABLE width="100%" bgColor=#ffffff&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;Option Explicit&lt;BR&gt;&lt;BR&gt;Private m_AppPath As String&lt;BR&gt;&lt;BR&gt;Private Sub Form_Load()&lt;BR&gt;' Get the application's startup path.&lt;BR&gt;m_AppPath = App.Path&lt;BR&gt;If Right$(m_AppPath, 1) ＜＞ "\" Then m_AppPath = m_AppPath &amp;amp; "\"&lt;BR&gt;&lt;BR&gt;' Load the values.&lt;BR&gt;LoadValues&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;Private Sub Form_Unload(Cancel As Integer)&lt;BR&gt;' Save the current values.&lt;BR&gt;SaveValues&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;' Load saved values from XML.&lt;BR&gt;Private Sub LoadValues()&lt;BR&gt;Dim xml_document As DOMDocument&lt;BR&gt;Dim values_node As IXMLDOMNode&lt;BR&gt;&lt;BR&gt;' Load the document.&lt;BR&gt;Set xml_document = New DOMDocument&lt;BR&gt;xml_document.Load m_AppPath &amp;amp; "Values.xml"&lt;BR&gt;&lt;BR&gt;' If the file doesn't exist, then&lt;BR&gt;' xml_document.documentElement is Nothing.&lt;BR&gt;If xml_document.documentElement Is Nothing Then&lt;BR&gt;' The file doesn't exist. Do nothing.&lt;BR&gt;Exit Sub&lt;BR&gt;End If&lt;BR&gt;&lt;BR&gt;' Find the Values section.&lt;BR&gt;Set values_node = xml_document.selectSingleNode("Values")&lt;BR&gt;&lt;BR&gt;' Read the saved values.&lt;BR&gt;txtFirstName.Text = GetNodeValue(values_node, "FirstName", "???")&lt;BR&gt;txtLastName.Text = GetNodeValue(values_node, "LastName", "???")&lt;BR&gt;txtStreet.Text = GetNodeValue(values_node, "Street", "???")&lt;BR&gt;txtCity.Text = GetNodeValue(values_node, "City", "???")&lt;BR&gt;txtState.Text = GetNodeValue(values_node, "State", "???")&lt;BR&gt;txtZip.Text = GetNodeValue(values_node, "Zip", "???")&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;' Return the node's value.&lt;BR&gt;Private Function GetNodeValue(ByVal start_at_node As IXMLDOMNode, _&lt;BR&gt;ByVal node_name As String, _&lt;BR&gt;Optional ByVal default_value As String = "") As String&lt;BR&gt;Dim value_node As IXMLDOMNode&lt;BR&gt;&lt;BR&gt;Set value_node = start_at_node.selectSingleNode(".//" &amp;amp; node_name)&lt;BR&gt;If value_node Is Nothing Then&lt;BR&gt;GetNodeValue = default_value&lt;BR&gt;Else&lt;BR&gt;GetNodeValue = value_node.Text&lt;BR&gt;End If&lt;BR&gt;End Function&lt;BR&gt;&lt;BR&gt;' Save the current values.&lt;BR&gt;Private Sub SaveValues()&lt;BR&gt;Dim xml_document As DOMDocument&lt;BR&gt;Dim values_node As IXMLDOMNode&lt;BR&gt;&lt;BR&gt;' Create the XML document.&lt;BR&gt;Set xml_document = New DOMDocument&lt;BR&gt;&lt;BR&gt;' Create the Values section node.&lt;BR&gt;Set values_node = xml_document.createElement("Values")&lt;BR&gt;&lt;BR&gt;' Add the Values section node to the document.&lt;BR&gt;xml_document.appendChild values_node&lt;BR&gt;&lt;BR&gt;' Create nodes for the values inside the&lt;BR&gt;' Values section node.&lt;BR&gt;CreateNode values_node, "FirstName", txtFirstName.Text&lt;BR&gt;CreateNode values_node, "LastName", txtLastName.Text&lt;BR&gt;CreateNode values_node, "Street", txtStreet.Text&lt;BR&gt;CreateNode values_node, "City", txtCity.Text&lt;BR&gt;CreateNode values_node, "State", txtState.Text&lt;BR&gt;CreateNode values_node, "Zip", txtZip.Text&lt;BR&gt;&lt;BR&gt;' Save the XML document.&lt;BR&gt;xml_document.save m_AppPath &amp;amp; "Values.xml"&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;' Add a new node to the indicated parent node.&lt;BR&gt;Private Sub CreateNode(ByVal parent As IXMLDOMNode, _&lt;BR&gt;ByVal node_name As String, ByVal node_value As String)&lt;BR&gt;Dim new_node As IXMLDOMNode&lt;BR&gt;&lt;BR&gt;' Create the new node.&lt;BR&gt;Set new_node = parent.ownerDocument.createElement(node_name)&lt;BR&gt;&lt;BR&gt;' Set the node's text value.&lt;BR&gt;new_node.Text = node_value&lt;BR&gt;&lt;BR&gt;' Add the node to the parent.&lt;BR&gt;parent.appendChild new_node&lt;BR&gt;End Sub&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;STRONG&gt;&lt;FONT color=#ac0000&gt;SaveValuesIndented 程序&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;　　虽然每个人都化了很大的精力去处理xml文档，使他们看上更容易些，但xml工具一般都忽略了那些使xml文档结构明显的空白和缩进，xml解析器也同样忽略缩进和空白。&lt;BR&gt;&lt;BR&gt;　　不幸的是我们例子也同样忽略了这些缩进和空白，SaveValues创建了一个象下面那样的xml文件，所有的代码都在同一行中。&lt;BR&gt;&lt;BR&gt;
&lt;TABLE width="100%" bgColor=#ffffff&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;＜Values＞＜FirstName＞Rod＜/FirstName＞＜LastName＞Stephens＜/LastNa&lt;BR&gt;me＞＜Street＞1234 Programmer Place＜/Street＞＜City＞Bugsville＜/Ci&lt;BR&gt;ty＞＜State＞CO＜/State＞＜Zip＞80276＜/Zip＞＜/Values＞&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;　　VB.NET中包括了文本写入类，可以XML文档规定格式。但MSXML重没有这种功能，所以如果需要以一种清晰的格式保存XML文件，只能另行添加它的格式。&lt;BR&gt;&lt;BR&gt;　　List2列出了程序SaveValuesIndented使用的代码，SaveValues子程序与上面例子中讲的几乎完全相同，但他在创建value节点后同时给XML文档创建了一个＜value＞标记的新行。&lt;BR&gt;&lt;BR&gt;　　然后SaveValues 调用CreateNode创建一个新的数据节点，但在这里它传递给CreateNode一个新的参数，这个参数表示这个新节点的缩进方式。&lt;BR&gt;&lt;BR&gt;
&lt;TABLE width="100%" bgColor=#ffffff&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;CreateNode&lt;BR&gt;' Save the current values.&lt;BR&gt;Private Sub SaveValues()&lt;BR&gt;Dim xml_document As DOMDocument&lt;BR&gt;Dim values_node As IXMLDOMNode&lt;BR&gt;&lt;BR&gt;' Create the XML document.&lt;BR&gt;Set xml_document = New DOMDocument&lt;BR&gt;&lt;BR&gt;' Create the Values section node.&lt;BR&gt;Set values_node = xml_document.createElement("Values")&lt;BR&gt;&lt;BR&gt;' Add a new line.&lt;BR&gt;values_node.appendChild xml_document.createTextNode(vbCrLf)&lt;BR&gt;&lt;BR&gt;' Add the Values section node to the document.&lt;BR&gt;xml_document.appendChild values_node&lt;BR&gt;&lt;BR&gt;' Create nodes for the values inside the&lt;BR&gt;' Values section node.&lt;BR&gt;CreateNode 4, values_node, "FirstName", txtFirstName.Text&lt;BR&gt;CreateNode 4, values_node, "LastName", txtLastName.Text&lt;BR&gt;CreateNode 4, values_node, "Street", txtStreet.Text&lt;BR&gt;CreateNode 4, values_node, "City", txtCity.Text&lt;BR&gt;CreateNode 4, values_node, "State", txtState.Text&lt;BR&gt;CreateNode 4, values_node, "Zip", txtZip.Text&lt;BR&gt;&lt;BR&gt;' Save the XML document.&lt;BR&gt;xml_document.save m_AppPath &amp;amp; "Values.xml"&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;' Add a new node to the indicated parent node.&lt;BR&gt;Private Sub CreateNode(ByVal indent As Integer, _&lt;BR&gt;ByVal parent As IXMLDOMNode, ByVal node_name As String, _&lt;BR&gt;ByVal node_value As String)&lt;BR&gt;Dim new_node As IXMLDOMNode&lt;BR&gt;&lt;BR&gt;' Indent.&lt;BR&gt;parent.appendChild _&lt;BR&gt;parent.ownerDocument.createTextNode(Space$(indent))&lt;BR&gt;&lt;BR&gt;' Create the new node.&lt;BR&gt;Set new_node = parent.ownerDocument.createElement(node_name)&lt;BR&gt;&lt;BR&gt;' Set the node's text value.&lt;BR&gt;new_node.Text = node_value&lt;BR&gt;&lt;BR&gt;' Add the node to the parent.&lt;BR&gt;parent.appendChild new_node&lt;BR&gt;&lt;BR&gt;' Add a new line.&lt;BR&gt;parent.appendChild parent.ownerDocument.createTextNode(vbCrLf)&lt;BR&gt;End Sub&lt;BR&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;　　&lt;B&gt;&lt;FONT color=#ac000&gt;结论&lt;/FONT&gt;&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;　　本文仅仅揭示XML编程的表面，本文的例子中的涉及只是非常简单的XML文件，但你可以使用使用本文揭示的技术做更多的事情，比如配置设置、表单位置、以及其他信息。XML已经向前更进一步的发展了，有了更复杂的数据层次。对于更复杂的数据结构，在运行时可以更容易的使用MSXML对象来存取XML文件&lt;BR&gt;&lt;BR&gt;&amp;nbsp;原文引用 &lt;A href="http://www.yesky.com/20021016/1635180_2.shtml"&gt;http://www.yesky.com/20021016/1635180_2.shtml&lt;/A&gt;&lt;img src ="http://blog.vckbase.com/jim97/aggbug/12099.html" width = "1" height = "1" /&gt;</description></item></channel></rss>