荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Jobs (温少), 信区: Visual
标  题: XML DOM 初学者指南(for VB)
发信站: BBS 荔园晨风站 (Sat May  6 18:45:28 2000), 转信




XML DOM 初学者指南
作者:董胜涛



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

目录:

简介

DOM是什么

如何使用DOM

如何Load一个文档

处理错误

如何从XML文档中取得信息

如何遍历XML文档

下一步该干什么

简介:

作为VB的开发者你可能会接触eXtensible Markup Language (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>

<track>In The Wee Small Hours</track>

<track>Mood Indigo</track>

<track>Glad To Be Unhappy</track>

<track>I 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>

<track>Welcome</track>

<track>Have You Ever</track>

<track>Staring At The Sun</track>

<track>Pretty Fly (For A White Guy)</track>

</tracks>

<price>$12.99</price>

</compactdisc>

</compactdiscs>

上面的文档的第二行引用了一个外部DTD(文档类型描述),DTD描述了一个特定类
型的XML的层次结构和能包括的内容。XML解析器利用DTD来验证XML文档的正确性。
DTD只是你用来让解析器验证XML文档是否合法的办法的一种,另一个越来越受欢迎
的方法是XML Schemas,它用XML来描述Schemas而不是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 Documents\cds.xml") Then

' 文档调入成功

' 作我们喜欢作的事

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 Documents\cds.xml") Then

' 文档调入成功

' 作我们喜欢作的事

Else

' 文档调入失败

End If

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

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

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

Dim xDoc As MSXML.DOMDocument

Set xDoc = New MSXML.DOMDocument

If xDoc.Load("C:\My Documents\cds.xml") Then

' 文档调入成功

' 作我们喜欢作的事

Else

' 文档调入失败

Dim strErrText As String

Dim xPE As MSXML.IXMLDOMParseError

' 获得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界面,你利用它来读/写各个分离的节点元素。在使用它之
前,你必须先理d">




你通过IXMLDOMNode界面实现的两个属性来访问节点的类型。NodeType属性列举了
DOMNodeType所有项目(一些项目列举在上面的表格上)。另外,你可以用
NodeTypeString属性来获得表示节点类型的字符串。

一旦你有了文档的DOM引用,你就可以遍历节点的层次。通过文档引用,你可以访
问ChildNodes属性,它给出了一个自上而下的包含所有节点的目录。ChildNodes属
性实现了IXMLDOMNodeList,它支持Visual Basic的For/Each结构,所以你可以列
举出ChildNodes中的所有节点。另外,ChildNodes属性还实现了Level属性,它可
以返回所有子节点的数目。

不諼ML文档的ChildNodes属性一个引用作
为它的参数,同时传递一个整数用来标示开始显示的层次级别。代码利用参数来格
式化在Visual Basic文档结构显示窗口中的文本。

DisplayNode属性的函数会遍历文档寻找需要的NODE_TEXT节点类型串,一旦代码找
到一个NODE_TEXT的节点,它会利用NodeValue属性来获得相应的文本串。另外,当
前节点的ParentNode属性指向一个元素类型的节点。元素节点实现了一个NodeName
属性,

NodeName和NodeValue属性会被显示。

如果一个节点还有子节点,通过检测HasChildNodes属性确认,DisplayNode就会调
用自己知道遍历文档的全部。

下面这个DisplayNode程序用Debug.Print向Visual Basic窗口写入相关信息。

Public Sub LoadDocument()

Dim xDoc As MSXML.DOMDocument

Set xDoc = New MSXML.DOMDocument

xDoc.validateOnParse = False

If xDoc.Load("C:\My Documents\sample.xml") Then

' The docum恪?


下一步该干什么:

这仅仅是个开始,你现在可以更深的了解XML和Microsoft 解析器(Msxml.dll)。你
可以作一些有趣的事例如改变某个节点的值,搜索文档,建立你自己的文档等等。
访问 MSDN Online XML Developer Center以获得更多的例子,文章和下载。



--

   好好学习,天天向上!!!!

※ 来源:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.1.115]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店