XML DOM 初学者指南

尼姑309

尼姑309

2016-02-19 12:49

下面请跟着图老师小编一起来了解下XML DOM 初学者指南,精心挑选的内容希望大家喜欢,不要忘记点个赞哦!

总述:本文主要讨论如何利用XMLDOM访问和维护XML文档,该XMLDOM由Microsoft 解析器实现。

简介

作为VB的开发者你可能会接触XML文档。你现在想处理XML文档并把它集成到你的方案中。你可以自己编程解析,把它当普通文本文档处理,但这样作太没有效率了,没有利用XML的强大之处:它可以结构化的表示数据。

从XML文件中获得信息最好的办法是利用XML解析器。解析器,简单的讲,就是一个软件,它可以使XML文件中的数据易于使用。作为VB的开发者,你可能想得到一个支持Document Object Model (DOM)的解析器。DOM描述了一系列标准的访问XML和HTML文档的方法,这些方法解析器应该实现。一个支持DOM的解析器应该把XML中的数据变成一系列对象,这样就可以对这些对象二次编程。在这篇文章中,你会学习如何利用Microsoft 解析器(Msxml.dll)实现的DOM结构访问和维护XML文档。

在我们继续前进时,让我们先看一段XML代码来了解这个解析器怎样使我们生活变得容易。下面这个叫cds.xml的文档用来表示一个唱片的各个项目,每个项目包含象主唱,标题,音轨这样的信息。

? xml version="1.0"?
! DOCTYPE compactdiscs SYSTEM "cds.dtd"

compactdiscs
compactdisc
artist type="individual"Frank Sinatra/artist
title numberoftracks="4"In The Wee Small Hours/title
tracks
trackIn The Wee Small Hours/track
trackMood Indigo/track
trackGlad To Be Unhappy/track
trackI Get Along Without You Very Well/track
/tracks
price$12.99/price
/compactdisc
compactdisc
artist type="band"The Offspring/artist
title numberoftracks="5"Americana/title
tracks
trackWelcome/track
trackHave You Ever/track
trackStaring At The Sun/track
trackPretty Fly (For A White Guy)/track
/tracks
price$12.99/price
/compactdisc
/compactdiscs
上面的文档的第二行引用了一个外部DTD(文档类型描述),DTD描述了一个特定类型的XML的层次结构和能包括的内容。XML解析器利用DTD来验证XML文档的正确性。DTD只是你用来让解析器验证XML文档是否合法的办法的一种,另一个越来越受欢迎的方法是XML Schema,它用XML来描述Schema而不是DTD。与DTD不同的是, Schema是用XML来描述的,也就是使用它自己的"有趣的"语法。
下面的文档是cds.xml用到的cds.dtd。
! ELEMENT compactdiscs (compactdisc*)
! ELEMENT compactdisc (artist, title, tracks, price)
! ENTITY % Type "individual | band"
! ELEMENT artist (#PCDATA)
! ATTLIST artist type (%Type;) #REQUIRED
! ELEMENT title (#PCDATA)
! ATTLIST title numberoftracks CDATA #REQUIRED
! ELEMENT tracks (track*)
! ELEMENT price (#PCDATA)
!ELEMENT track (#PCDATA)
本文不会对DTD和XML Schemas讨论过深,基于XML-DATA的XML Schema Reference已提交给W3C。

DOM是什么

XML DOM结构将XML文档的内容实现为一个对象模型。W3C的DOM Level 1 说明定义了DOM结构如何实现属性、方法、事件等等。微软的DOM实现完全支持W3C标准,并且还有许多使程序更容易访问XML文件的新增特点。

如何使用DOM

要使用DOM,需要创建一个XML解析器的实例。微软公司在Msxml.dll中创建了一系列标准的COM接口来使创

建实例变得可能。Msxml.dll中包含了类型库和可应用的代码,这些你可以用来处理XML文件。如果你使用可实现脚本的客户端,比如VBScript 和IE,你可以使用CreateObject方法来得到解析器的实例。

Set objParser = CreateObject( "Microsoft.XMLDOM")

如果你使用ASP(Active Server Page),你使用Server.CreateObject方法。

Set objParser = Server.CreateObject( "Microsoft.XMLDOM" )

如果你在使用VB,你可以创建一个对MSXML类型库的引用,这样就可以访问DOM。要在VB6.0中使用MSXML,操作如下:

打开Project References项

从COM对象中选择Microsoft XML, version 2.0,如果你找不到此项,你需要得到它。

你可以创建一个解析器的实例了。

Dim xDoc As MSXML.DOMDocument

Set xDoc = New MSXML.DOMDocument

你可以通过两个途径获得Msxml.dll。

你可以安装IE5.0,MSXML解析器是其中集成的部件。

或者你可以到相关网站上下载它

一旦你建立了类型库的引用,你就可以执行解析,调入文档,总之,你可以处理XML文档了。

你可能有一些迷惑,我该干些什么?如果你打开MSXML库,用Visual Basic 6.0对象察看器察看其中的对象模型,你会发现很丰富。本文会告诉你如何利用DOMDocument类和IXMLDOMNode界面来访问XML文档。

如何Load一个文档

要调入一个XML文档,先必须创建一个DOMDocument的实例。

Dim xDoc As MSXML.DOMDocument

Set xDoc = New MSXML.DOMDocument

当你获得一个合法的引用,你就可以用LOAD方法来调入一个文档。解析器可以从本地硬盘调入或者通过UNC和URL从网络上调入。

从硬盘调入如下:

If xDoc.Load("C:My Documentscds.xml") Then

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

’ 文档调入成功

’ 作我们喜欢作的事

Else

’ 文档调入失败

End If

当你完成工作,你需要释放掉这个引用,MSXML没有直接实现CLOSE方法,你最好直接将它设置成Nothing来关闭它。

Set xDoc = Nothing

当你调用一个文档,默认是异步进行,你可以通过修改Async属性来更改它。如果你要操作文档,你必须先检查ReadyState属性来确认文档的状态,它会返回五种可能的结果。

状态                     属性值

未初始化:调入文档没有开始           0

调入:Load方法正在执行             1

调入完成:Load 方法已经完成           2

交互阶段:DOM可以进行只读检验,数据部分解析   3

完成:数据完全解析,可以进行读/写操作      4

MSXML解析器实现了一些有用的方法,你在调入一个大的文档时可以用这些方法追踪调入过程的状态。这些方法对从Internet上异步的调入文档也很有帮助。

要打开一个Internet上的文档,你需要提供绝对URL,并且必须加http://前缀。下面是一个例子。

xDoc.async = False

If xDoc.Load("http://www.develop.com/hp/brianr/cds.xml") Then

’ 文档调入成功

’ 作我们喜欢作的事

Else

’ 文档调入失败

End If

将Async属性设置为False,这样在文档调入完成之前,解析器不会将控制权交给你的代码。如果把Async保存为True,你在访问文档时必须检查ReadyState属性或者利用DOMDocument的事件在文档可以访问时提示你的代码。

处理错误

你的文档可能因为各种原因而调入失败,最常见的原因是提供给解析器的文档名不正确,另一个常见的原因是XML文档不合法。

默认的解析器会验证你的文档是否符合某个DTD 或者 schema,你可以不让解析器执行验证,在执行Load方法之前,将DOMDocument的属性ValidateOnParse为False。

Dim xDoc As MSXML.DOMDocument

Set xDoc = New MSXML.DOMDocument

xDoc.validateOnParse = False

If xDoc.Load("C:My Documentscds.xml") Then

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

’ 文档调入成功

’ 作我们喜欢作的事

Else

’ 文档调入失败

End If

事先关闭验证功能不是个好主意,它会带来许多问题,至少它会是你提供错误格式的数据给你的用户。

你可以通过访问ParseError对象来从解析器那儿获得有关错误类型的信息。创建一个IXMLDOMParseError界面的引用,然后把它指向文档自身的ParseError对象。IXMLDOMParseError界面实现了七种属性来使你获得错误原因。

下面的例子显示了一个信息框,列出了ParseError对象中所有错误信息。

Dim xDoc As MSXML.DOMDocument

Set xDoc = New MSXML.DOMDocument

If xDoc.Load("C:My Documentscds.xml") Then

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

’ 文档调入成功

’ 作我们喜欢作的事

Else

’ 文档调入失败

Dim strErrText As String

Dim xPE As MSXML.IXMLDOMParseError

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

’ 获得parseError对象

Set xPE = xDoc.parseError

With xPE

strErrText = "你的XML Document 不能调入" & _

"原因是." & vbCrLf & _

"错误 #: " & .errorCode & ": " & xPE.reason & _

"Line #: " & .Line & vbCrLf & _

"Line Position: " & .linepos & vbCrLf & _

"Position In File: " & .filepos & vbCrLf & _

"Source Text: " & .srcText & vbCrLf & _

"Document URL: " & .url

End With

MsgBox strErrText, vbExclamation

End If

Set xPE = Nothing

你可以利用parseError对象来向你的用户报告错误信息,或者把它写入你个Log中,你还可以尝试自己解决遇到的问题。

如何从XML文档中取得信息
一旦你成功的调入了文档,下一步就是如何从中获得信息了。当你操作文档时,你经常会用到IXMLDOMNode界面,你利用它来读/写各个分离的节点元素。在使用它之前,你必须先理解MSXML支持的13种节点元素类型,下面是最常用的几个。
DOM节点类型
举例
NODE_ELEMENT
artist type="band"The Offspring/artist
NODE_ATTRIBUTE
type="band"The Offspring
NODE_TEXT
The Offspring
NODE_PROCESSING_INSTRUCTION
?xml version="1.0"?
NODE_DOCUMENT_TYPE
!DOCTYPE compactdiscs SYSTEM "cds.dtd"


你通过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文档
你能够遍历文档的节点是利用文档对象,因为XML本身就是层次结构,所以很容易编写递归代码来访问整个文档。
LoadDocument程序打开XML文档,然后调用另一个程序DisplayNode,它用来显示文档的结构。LoadDocument传递给正在打开的XML文档的ChildNodes属性一个引用作为它的参数,同时传递一个整数用来标示开始显示的层次级别。代码利用参数来格式化在Visual Basic文档结构显示窗口中的文本。
DisplayNode属性的函数会遍历文档寻找需要的NODE_TEXT节点类型串,一旦代码找到一个NODE_TEXT的节点,它会利用NodeValue属性来获得相应的文本串。另外,当前节点的ParentNode属性指向一个元素类型的节点。元素节点实现了一个NodeName属性,
NodeName和NodeValue属性会被显示。
如果一个节点还有子节点,通过检测HasChildNodes属性确认,DisplayNode就会调用自己知道遍历文档的全部。
下面这个DisplayNode程序用Debug.Pr

int向Visual Basic窗口写入相关信息。
Public Sub LoadDocument()
Dim xDoc As MSXML.DOMDocument
Set xDoc = New MSXML.DOMDocument
xDoc.validateOnParse = False
If xDoc.Load("C:My Documentssample.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)。你可以作一些有趣的事例如改变某个节点的值,搜索文档,建立你自己的文档等等。

 

展开更多 50%)
分享

猜你喜欢

XML DOM 初学者指南

Web开发
XML DOM 初学者指南

给 XML 初学者

Web开发
给 XML 初学者

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

HTML 初学者指南

Html CSS布局 Div+CSS XHTML
HTML 初学者指南

HTML 初学者指南(一)

PHP
HTML 初学者指南(一)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

HTML 初学者指南(三)

PHP
HTML 初学者指南(三)

HTML 初学者指南(六)

PHP
HTML 初学者指南(六)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

超级链接a的提示方式和打开方式

超级链接a的提示方式和打开方式

XML入门精解之结构与语法(1)

XML入门精解之结构与语法(1)
下拉加载更多内容 ↓