1、什么是XML 扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。 XML与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,XML仅仅是展示数据。事实上XML与其他数据表现形式最大的不同是:他极其简单。这是一个看上去有点琐细的优点,但正是这点使XML与众不同。 XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软
2、件也支 其 的数据交换 式,但不 他 支 XML, 程序可以更 易的与Windows、Mac OS, Linux以 其他 的 ,然 可以很 易 XML数据 程序中 分析他, 以XML 式 。 XML的优点 XML于在不同的应用程序 间交换数据,XML件也便于建的数据库,不 以,软件使用INI件存储currency1 、用“数以 其他 , 软引了系fifl 表,软 不应 使用INI件了, Visual Basic”INI件的支 了。但不 的是fl 表有个致的点:不是简单的件,于读写、可能大和 、如 fl 表不何 现 , 有可能成系fi。 currency1 在XML件中可以 这些 , 可以 XM
3、L件 currency1为一个共 件,这 在不同的 上的用 可以共 数据,这是fl 表 不能比 的。 在 为 一 ASP的ASP.NET中可以在WEB 中 使用XML,可以使用数据 件 数据 示。 然也可以不XML,使用件、fl 表、数据库 可以成XML 能成的任 ,XML 是在数据存储和 的 一种 而 。 XML语 简 XML的语 的简单,XML点成,使用 和关 点描述标记,在 式上与HTML标记相 , 间最大的不同是:XML中可以 义标记名。比如 面的标记 描述了一个电话号码: Phone987-654-3210/Phone 而且不用声明标记名 可以使用。 始和 束标记必须相同,XML是识
4、别大写的, 以标记的大写也必须相同。比如上面的例子中以Phone标记 始 必须以/Phone标记 束,而不能是/phone或/PHONE 点标记中可以包含属性,比如 面的 码中Phone点包含属性Type,其值为WorkFax: Phone Type=“WorkFax“987-654-3210Phone 如 不愿 在点中包含一个值, 么可以不需要 束标记,可以用在 始标记的 面 一个斜线 束点,在 面的例子中,Phone标记的Number属性 存储了一个电话号码, 以 不需要一个 束标记:Phone Type=“WorkFax“ Number=“987-654-3210“ / XML的 是一个
5、树形等级 。必须有一个唯一的根 点,根点包含 有其 点。 面举一个较为整的例子: Addresses Entry Type=“Personal“ FirstNameAndy/FirstName LastNameFickle/LastName Street1234 Programmer Place/Street CityBugsville/City StateCO/State Zip82379/Zip Phone Type=“Home“354-493-9489/Phone /Entry Entry Type=“Work“ FirstNameBetty/FirstName LastNameMast
6、erson/LastName Phone Type=“Work“937-878-4958/Phone Phone Type=“WorkFax“937-878-4900/Phone /Entry . /Addresses fl 相 的点不需要包含相同的 ,例如第一个Entry点包含了地址 和家庭电话号码,第二个Entry点包含了Work和WorkFax电话号码,而没有包含第一个Entry点包含的 。 XML 如面的例子 示,XML语 是如此的简单以 于可以在很短的间一个XML解析器, 运的是不必这 做,因为XML 可以运行在各种 上,包括可以安装了Visual Basic的Windows。 正是
7、这些L 而不是XML身使XML更强大和 杂。不同的解析器使可以某一刻 整个XML或 某个点,与此相反,XML Writer 可以同创建一个XML和点。 DOM解析器使 能够很方便的 、 制、排序、修改和存储XML件,遍历点获名 或属性,给 排序。虽然他 的功能没有真正的关系数据库强大,但DOM的这些特点依然 有用。 XSD可以义XML的 式,XSL扩展 式单义了怎 XML转换成其他可以在WEB浏览器中浏览的件 式,比如HTML件。 这些 实际上比XML身更 杂, 以 有讲解XML的书籍 花了很大的篇幅解释这些XML 。但这超 了的范围,有兴趣的读者可以“考有关资料。 Visual Basic.
8、Net提供了使用XML、XSL以 其他XML 的整 。但不用等待VB.NET,软XML核心服 (MSXML)版4.0提供了Visual Basic6.0 和存储XML的 。 在 最新版的MSXML, 安装在 上。在Visual Basic 6.0中使用Microsoft XML V4.0象引用其他”象一 ,首先在程菜单中引用菜单项,Microsoft V4.0,单击OK,一切成 现在 可以在VB应用程序中添 XML”象了。 DOMDocument 类 ”象模型(DOM)使用了一系列相应的”象描述了XML的等级状态,DOMDocument类是一个描绘XML的DOM 的MSXML类。 DOMDoc
9、ument类仅仅提供了很少的个有用的属性和方 。Load方 一个xml件,loadxml方 字符串为xml数据添 ”象中。例如, 面的 码 一个的xml件添 名为xml_document的中。 Dim xml_document As New DOMDocument xml_document.loadXML _ “Person“ & vbCrLf & _ “ FirstNameRod/FirstName“ & vbCrLf & _ “ LastNameStephens/LastName“ & vbCrLf & _ “/Person“ DOMDocument的xml属性返回的xml描述,可以 示这
10、些返回值看看这些究竟是什么 子,也可以 存储为一个件,但这全不必要,因为DOMDocument”象的save方 经 他 存储了。DOMDocument”象的documentElement属性表示数据的根 点,通 情况 操XML 这里 始。 DOMDocument提供了种创建新点的方 。CreateElement方 为创建一个新的 点,其他创建点的方 有createAttribute, createProcessingInstruction, 和 createTextNode,在这里 不一一 了。 IXMLDOMNode类 IXMLDOMNode类描述了一个点, 类提供了一系列用于 索和操 XM
11、L的属性和方 。 selectSingleNode 方 用于 索 点的 ,用于 索 点 的语言 为XPATH,XPATH , 不 细 明其 范了。 面 个” 索子点有特别有用 且简单的方 。 在给selectsingleNode方 中 子点的名字, 方 在点的子点进行 索。如在 的字符串面 上“./“, 么 索点的全 。 Search for a child node named “LastName.“ Set last_name_node = address_node.selectSingleNode(“LastName“) Search for any descendant named “
12、LastName.“ Set last_name_node = address_node.selectSingleNode(“./LastName“) 面列 了IXMLDOMNode”象的 分 有用的属性: attributes.点属性 nodeName.点的标记名 nodeTypeString.点的类型 ownerDocument.返回DOMDocument”象包含的点 text.表示点包含的 。如 点包含其他点, 么text 表了 有点的 的 。 xml.给 了点的xml ,例如:“FirstNameRod/FirstName“. ChildNodes 包含了点的子点。要给点 一个子点,首
13、先必须给使用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 IXMLDOM
14、Node Create the new node. Set new_node = parent.ownerDocument.createElement(node_name) Set the nodes 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件中 数据,在程序运行 束, 程序中的现行值存VALU
15、E.XML件中。 面的 码是 示了VALUE.XML件的 : Values FirstNameRod/FirstName LastNameStephens/LastName Street1234 Programmer Place/Street CityBugsville/City StateCO/State Zip80276/Zip /Values List1 示了怎 写SaveValues, 表单,form_load事件 LoadValues子程序。 LoadValues创建了一个名为xml_document的DOMDocument”象,然 xml件,使用selectSingleNode方
16、查找名为values的点,然 使用GetNodeValue方 获value点 中 的值。 GetNodeValue使用value点的selectSingleNode方 找 标点,如 点不存在 数 返回一个 值,如 找 这个点GetNodeValue 返回 点的text值。”于value.xml件中的数据点,text仅仅是包含在点中的 。 form_unload事件,unload事件用SaveValues子程序。程序创建一个新的DOMDocument”象, ”象创建一个新的名为value的点,然 用的appendChild方 点添中。 在创建 有新的点 ,SaveValues用DOMDocume
17、nts save方 存储新的xml件。 fl 这个新的件 经了件,使用DOMDocument”象 分改XML件,可以 XML件,然 修改其中一 分,然 存件,但件 全。这是一个的currency1,但在这可以使用其 程序进行修改。 List1的最 一 分是CreateNode子程序,CreateNode 为 点创建一个新点 同给这个点值。在这个子程序中首先引用一个DOMDocument”象,然 使用 ”象的createElement方 创建一个新的点。 createNode方 currency1点的text属性,然 点为子点添 点中。 List1: Option Explicit Privat
18、e m_AppPath As String Private Sub Form_Load() Get the applications startup path. m_AppPath = App.Path If Right$(m_AppPath, 1) “ Then m_AppPath = m_AppPath & “ Load the values. LoadValues End Sub Private Sub Form_Unload(Cancel As Integer) Save the current values. SaveValues End Sub Load saved values
19、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 doesnt exist, then xml_document.documentElement is Nothing. If xml_document.documentElement I
20、s Nothing Then The file doesnt 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“, “?“) tx
21、tStreet.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 nodes value. Private Function GetNodeValue(ByVal start_at_node
22、As IXMLDOMNode, _ ByVal node_name As String, _ Optional ByVal default_value As String = “) As String Dim value_node As IXMLDOMNode Set value_node = start_at_node.selectSingleNode(“./“ & node_name) If value_node Is Nothing Then GetNodeValue = default_value Else GetNodeValue = value_node.Text End If E
23、nd 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
24、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
25、“, 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 St
26、ring, ByVal node_value As String) Dim new_node As IXMLDOMNode Create the new node. Set new_node = parent.ownerDocument.createElement(node_name) Set the nodes text value. new_node.Text = node_value Add the node to the parent. parent.appendChild new_node End Sub SaveValuesIndented 程序 虽然“个 了很大的 力去fixml
27、,使他 看上更 易些,但xml 一fl 了 些使xml 明 的空和进,xml解析器也同 进和空。 不 的是 例子也同 了这些进和空,SaveValues创建了一个象 面 的xml件, 有的 码 在同一行中。 ValuesFirstNameRod/FirstNameLastNameStephens/LastNa meStreet1234 Programmer Place/StreetCityBugsville/Ci tyStateCO/StateZip80276/Zip/Values VB.NET中包括了写类,可以XML 式。但MSXML没有这种功能, 以如 需要以一种 的 式存XML件, 能
28、行添 的 式。 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 Cr
29、eate 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_no
30、de 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_no
31、de, “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, _
32、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 nodes 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件,但可以使用使用示的 做更多的事情,比如currency1 currency1、表单currency1、以 其他 。XML 经 更进一的 展了,有了更 杂的数据。”于更 杂的数据 ,在运行可以更 易的使用MSXML”象存XML件