admin管理员组

文章数量:1530951

2024年7月30日发(作者:)

重庆交通学院二OO五届毕业设计(论文)•说明书

重庆交通学院

题目XML语言的可视化编辑器

系(全称)

专业年级

学生姓名

指导教师

计算机与信息工程系

计算机科学与技术2001级

龚锐学号01060118

闫果

重庆交通学院二OO五届毕业设计(论文)•说明书

【Abstract】:

XML,whatiscalled,iseXtensibleMarkupLanguageforshort,whichisnotthesimple

expansionofHTML,buthascombinedtheadvantageofHTMLanddispelleditsshortcoming.

XMLisusedmoreandmoreextensively,gettingpeople'sgreatconcernasakindofnewly

arisenanddevelopingcomputertechnology,

present,XMLeditorwhichthedevelopercanuseisinaverylargerange,buttherearetoo

fewusesimplyandconveniently,xthas

introducedthedevelopmentprocessofvisualXMLeditor:Haveexpatiatedtheproposition

andmeaningofthesubjectatfirst,thencarryontheoverallstructuraldesignaccordingtothe

actualrequirementsituation,alsointroducethefunctionandapplicationofDOMand

MSXMLparser,andtheintroductionstoseveralAPIinterfacesofDOMconcretely,including

eachattribute,usagemethod,thereare

parsingdealsofXMLandconcreterealizationofcode.

KeyWords

:XMLHTMLeditorDOMAPI

【摘要】

所谓的XML,就是eXtensibleMarkupLanguage,即“可扩展标识语言”,它并不是

HTML的简单扩展,而是XML结合了HTML的优点并消除了其缺点。XML作为一种新兴的

计算机技术,应用越来越广泛,得到了人们的极大的关注,相关的研究不断涌现。目前,

开发人员可以使用的XML编辑器的范围很广,可是现在能找到的使用简便、免费的XML

编辑器太少了。本文介绍了XML可视化编辑器的开发过程:首先说明了课题的提出及其

意义,然后根据实际需求情况进行总体结构设计,还具体介绍了DOM和MSXML解析器的

功能和应用,以及DOM几个API接口的介绍,包括其中各个函数的属性、使用方法、并

附例子说明。最后是XML的解析处理及具体代码的实现。

【关键字】

可扩展标识语言

应用程序接口

超文本标识语言编辑器文档对象模型

2

重庆交通学院二OO五届毕业设计(论文)•说明书

目录

引言

..................................................................................................................................................

4

第一章概述

....................................................................................................................................

5

1.1前言

...................................................................................................................................

5

1.2XML简介

...........................................................................................................................

5

1.2.1XML的产生

............................................................................................................

6

1.2.2XML的发展

............................................................................................................

6

1.2.3XML的应用

............................................................................................................

8

1.3MFC简介

.........................................................................................................................

10

1.3.1C++类库

...............................................................................................................

11

1.3.2应用程序框架

......................................................................................................

11

1.3.3应用程序类型

......................................................................................................

11

第二章系统介绍

.........................................................................................................................

13

2.1系统概述

.........................................................................................................................

13

2.2可行性研究

.....................................................................................................................

15

第三章XML解析器

.....................................................................................................................

16

3.1XML解析器简介

............................................................................................................

16

3.2DOM

...................................................................................................................................

16

3.2.1DOM概述

..............................................................................................................

17

3.2.2DOM解析器的原理

.............................................................................................

17

3.3SAX

...................................................................................................................................

17

3.3.1SAX概述

..............................................................................................................

17

3.3.2SAX解析器的原理

.............................................................................................

18

3.4DOM和SAX的关系

.........................................................................................................

18

3.4.1DOM与SAX的优缺点比较

.................................................................................

18

3.4.2选择DOM的原因

................................................................................................

19

3.4.3关于DOM规范

.....................................................................................................

19

第四章MSXMLParser的使用

....................................................................................................

21

4.1MSXMLPARSER的概念

.................................................................................................

21

4.1.1XMLParser的功能

...........................................................................................

21

4.1.2MSXMLParser的使用

.......................................................................................

22

4.2DOM的接口

.....................................................................................................................

23

4.2.1DOM接口简介

......................................................................................................

23

4.2.2MSXML的COM接口

.............................................................................................

24

4.3接口对象方法举例

........................................................................................................

25

4.3.1Document对象

....................................................................................................

25

4.3.2Node对象

...........................................................................................................

29

4.3.3NodeList对象

....................................................................................................

30

4.3.4parseError对象

...............................................................................................

30

第五章MSXML解析的实现

..........................................................................................................

32

5.1解析流程

........................................................................................................................

32

3

重庆交通学院二OO五届毕业设计(论文)•说明书

5.1.1流程图

.................................................................................................................

32

5.1.2解析器的初始化

................................................................................................

33

5.2MSXML的解析处理

.......................................................................................................

33

5.2.1添加兄弟节点

.....................................................................................................

33

5.2.2添加子节点

.........................................................................................................

35

5.2.3添加文本节点

.....................................................................................................

37

5.2.4删除节点

.............................................................................................................

38

5.2.5替换节点

.............................................................................................................

39

5.2.6替换文本节点

.....................................................................................................

40

5.2.7属性修改

.............................................................................................................

41

第六章结束语

..............................................................................................................................

43

6.1总结

.................................................................................................................................

43

6.2致谢

.................................................................................................................................

43

参考文献

........................................................................................................................................

44

4

重庆交通学院二OO五届毕业设计(论文)•说明书

引言

W3C(WorldWideWebConsortium,世界广域网组织)在1998年创建了可扩展标识

语言XML(ExtensibleMarkuplanguage)标准,XML实质上是一种定义语言——任何

人、任何行业都可遵循这些法则,定义各种标识来描述信息中的所有元素,然后通过一

种被称为分析程序的小型程序进行处理,使信息能“自我描述”。XML现在已经被称为

INTERNET的“世界语”。

XML出现的意义不仅仅是改变了HTML僵化的固定标识集,而是从根本上改变了旧

式的信息构造方式,创造了一种让所有计算机系统均可进行“智能”交流的语言,使得

基于信息传输的互联网在信息检索和获取的方面发生了一种革命性变革,为整个互联网

的智能化奠定了基础。自从1998年初XML由W3C设计完成以来,这个标准便如野火般

漫延至科学和工业领域。

一些经过精选的规则使XML能够实现上述的一体化功能:其一就是标签总是成对出

现,其功能就像我们通常使用的括号一样,同时它们又具有引号的功能,可多层次嵌套

——嵌套规则采用计算机中常见的树结构,对于程序员来说简直是惊人的方便;其二是

它所依赖的一个新标准——通用计算机代码,这是一个支持世界上所有主要语言的混合

文本符号编码系统,因此,XML使得信息不但能在不同的计算机系统间交换,还能跨国、

跨文化地界交换。

以前,连接到网络的计算机和网络所能做的交互仅限于接收表格——填好后与网络

服务器来回交换直至工作完成,而XML由于通过给内容贴上标签来描述其意义,与显示

介质无关,所以,可使用一种名叫“格式表”的规则来给不同的设备进行自动重格式化

工作——这个正处于发展阶段的、供XML格式表用的标准被称为XSL(可扩展的格式表

语言)。XML附加上的结构和语义信息,允许计算机设备立刻处理大量工作,大大减轻了

网络服务器的负担,极大地降低网络通信量。1999年2月完成的RDF(资源描述框架)使

数十亿通过超链接连接起来网页可以在XML的支持下发挥更大作用。W3C由此制订一个

基于XML、称为XLink的超文本链接标准:此标准支持多目标目录选择,能够在点击处

直接插入其它网页的相关文本或图像,而不须关闭网页。然而,XLink最大的用途还在

于它能将网页的使用指向一些核心数据库中的条目,而非页面本身。当页面地址变更时,

制作者只需修改数据库记录便能更新所有指向它的链接,这有助于消除表示链接已被破

坏的常见错误——“404文件未找到”。

在设计一门新语言之前,设计者们必须在三件事上达成一致:允许使用何种标签,

标签元素怎样相互嵌套以及怎样处理。语言的词汇和结构——通常编写进DTD(文件类

型定义)。XML标准不强迫语言设计者使用DTD,但大多数基于XML开发的新语言都带有

DTD——它使程序员较易编写出能理解标识并对它作出巧妙处理的软件。所以,未来的

网络设计者不仅要精通文字和图像的制作,还要精通DTD、数据树、超链接结构、元数

据和格式表的相互依存的多层次系统结构——为第二代网络设计的更为坚实的基础结

构。

因此,开发一个图形画,便于用户使用XML进行行业化、领域化、个性化的高效率

的信息处理应运而生。

5

重庆交通学院二OO五届毕业设计(论文)•说明书

第一章概述

1.1前言

XML文档有两种广义类型:面向散文的和面向数据的。面向散文的文档借用了XML

的SGML根。散文格式通常有许多规则,通过这些规则,节、子节、段、章、图以及其

它项目可以彼此嵌套。典型情况下,它将内联的、面向字符的标记用于单个字和短语(粗

体、强调、引用和链接等)。DocBook就是一个著名并且广泛使用的示例;另一个示例

是IBM的developerWorks内部文章格式。相反,面向数据的文档很少拥有这样的文本,

但包含了数值和简单名称的嵌套类表结构。面向数据的XML通常类似于RDBMS表,有

时就是从此类数据库中生成的。通常,将XML看作列和行的能力对于面向数据的XML

而言很重要。

除了这些广义类型,还出现了一些特殊的XML“方言”。许多“方言”是面向数据

的,如SOAP、XML-RPC、WSDL和RDF等。尽管基本上所有的XML编辑器都能在一定程

度上处理定制的DTD,但有些特定需求可能要求更专门的定制。某些同样的问题可能也

适用于面向散文的格式,尤其是复杂格式,如DocBook、LegalXML或TEI。通常,XML

编辑器应该能够非常容易地创建和修改DTD或W3CXML模式的有效XML文档,验证和

良好格式检查、XSLT转换、浏览器预览以及项目(相关文件的集合,包括:XML、XSL、

CSS和模式等)的概念。

XMLwriter简介

XMLwriter是一个经典的XML编辑器。它与文本编辑器非常类似,并带有一些特定

于XML的额外特性。文档仅有的可编辑视图是原文视图(textualview),其中语法是

突出显示的。有几种利用MSXML和InternetExplorerDLL的预览方式—“可折叠

的”树、CSS显示和XSLT转换视图。所有这些预览视图都只是原原本本地嵌入

了InternetExplorer窗格。特别要注意的是,InternetExplorer仍不能正确地呈

现内联CSS元素(Mozilla和Opera完美地实现了这一点),这使得该视图对于面向

散文的文档的可用性大大削弱了。当然,如果您碰巧开发了针对(X)HTML的XSLT表,

则可以得到良好显示。XMLwriter根本不对面向数据的编辑提供任何支持。

除了文本编辑器特性以外,XMLwriter还拥有以下选项:验证和良好格式检查、

XSLT转换、浏览器预览以及项目(相关文件的集合,包括:XML、XSL、CSS和模式等)

的概念。与我研究的大多数其它产品相比,该产品的额外特性比较薄弱。TagBar是插

入元素的工具,它多少有些笨拙;输入属性时没有帮助;验证是严格地事后进行;搜索

对话框极其粗糙(没有正则表达式、XPath或即使是特定于元素/属性/值的搜索)。

XMLwriter所能做的所有事情,象jEdit这样通用的、免费的用于程序员的编辑器几

乎都能做得更好。

1.2XML简介

所谓的XML,就是eXtensibleMarkupLanguage,翻译成中文就是“可扩展标识语

言”。它是一个精简的SGML(标准通用标记语言),它保留了SGML的可扩展功能,并具

有HTML的易用性。

6

重庆交通学院二OO五届毕业设计(论文)•说明书

1.2.1XML的产生

XML是W3C(万唯网联盟)在1982年2月正式推出的作为下一代网页发布的语言。

它是一个精简的SGML(标准通用标记语言),它保留了SGML的可扩展功能,并具有HTML

的易用性。

作为一种新兴的计算机技术,XML推动着Web飞速向前发展。它的出现给各行业带

来了无限的商机。尤其XML技术同电子商务的结合,推动着传统产业高效的飞速发展。

虽然XML自公布之日才短短的几年时间,但却得到了人们的极大的关注,相关的研究及

其应用不断涌现。

所谓的XML,就是eXtensibleMarkupLanguage,翻译成中文就是“可扩展标识语

言”,在国内很多人理解xml为html的简单扩展,这实际上是一种误解。尽管xml同html

关系非常密切。

XML与SGML、HTML的关系。

SGML、HTML是XML的先驱。SGML是指“通用标识语言标准”(StandardGeneralized

MarkupLanguage),它是国际上定义电子文件结构和内容描述的标准,是一种非常复杂

的文档的结构,主要用于大量高度结构化数据的防卫区和其他各种工业领域,利于分类

和索引。同XML相比,定义的功能很强大,缺点是它不适用于Web数据描述,而且SGML

软件价格非常价格昂贵。HTML相信大家都比较熟悉,即“HyperTextMarkupLanguage”

(超文本标识语言),它的优点是比较适合web页面的开发。但它有一个缺点是标记相

对少,只有固定的标记集如

.等。缺少sgml的柔性和适应性。不能支持特

定领域的标记语言,如对数学、化学、音乐等领域的表示支持较少。举个例子来说,开

发者很难在webpape上表示数学公式、化学分子式和乐谱。

Xml结合了sgml和html的优点并消除其缺点。Xml仍然被认为是一种sgml语言。

比sgml要简单,但能实现sgml的大部分的功能。1996年的夏天,SunMicrossystem

的JohnBosak开始开发W3CSGML工作组(现在称为xml工作组)。他们的目标是创建

一种sgml,使其在Web中,既能利用Sgml的长处,又保留html的简单性。现在目标基

本达到。

1.2.2XML的发展

在专业领域中,出现了Web标记语言的许多项目,著名的有CML—化学标记语言,

由PeterMurray_Rust开发,同时开发了第一个通用xml浏览器Jumbo.在数学方面,

包括IBM公司再内都在致力开发MathML1997年四月,出版了xll的第一个版本。当xll

完整实现时,将比html和当前浏览器所达到的链接水平更复杂,更强大。1997年

8月,Microsoft公司和Inso公司引入xsl.由于xml是纯结构和语义的,需要描述单

个元素格式方法。可以使用html的CSS;另一种方案是xsl.1998年1月,microsoft公

司出版发行了msxsl程序。可以利用xsl表和xml文档创建能被IE4识别的html页面。

1998年2月,W3C发布了xml1.0的正式版本。最近一年多来,由于网络应用

的飞速发展,xml的发展非常迅猛。出现了DOM(DocumentObjectModel),XSLT(XSL

Transformation)等新名词,xml的应用软件也有了飞速的发展,Microsoft、IBM、Breeze、

Stilo等公司纷纷推出了自己的或解析器,或开发平台。在MicrosoftIBM、HP等大公司

的推动下,目前有两个著名的xml的研究组织,分别是和,由

他们向W3C提出标准的建议。其中biztalk是有Microsoft牵头组织的,有趣的是

7

重庆交通学院二OO五届毕业设计(论文)•说明书

Microsoft公司同时参加了oaisis,不过不同于IBM、HP等著名大公司,他的年费只交

10万美元,用Microsoft发言人的话就是“一切视oasis的发展而定!“,言下之意就

是如果oasis制定的标准抵触Microsoft的应用,一场标准大战不可避免。

什么是XML

首先XML是一种元标记语言,所谓“元标记”就是开发者可以根据自己的需要定义

自己的标记,比如开发者可以定义如下标记,任何满足xml命名规则的

名称都可以标记,这就为不同的应用程序打开了的大门。HTML是一种预定义标记语言,

它只认识诸如,

等已经定义的标记,对于用户自己定义的标记是不认识的。第

二xml是一种语义/结构化语言。它描述了文档的结构和语义。举个例子,在和html中,

要描述一本书,可以如下表示:

bookname

author_name
  • publisher_name;
  • isbn_number
      在xml中,

      同样的数据表示为booknameauthorname

      publishernameisbn_number从上

      面的对比,可以看出,xml的文档是有明确语义并且是结构化的。XML是一种通用的数

      据格式从低级的角度看,xml是一种简单的数据格式,是纯100%的ASCII文本,而

      ASCII的抗破坏能力是很强的。不象压缩数据和java对象,只要破坏一个数据文件数据

      就不可阅读。从高级的角度看,是一种自描述语言。

      XML可利用于数据交换主要是因为XML表示的信息独立于平台的,这里的平台即可

      以理解为不同的应用程序也可以理解为不同的操作系统;它描述了一种规范,利用它

      Microsoft的word文档可以和Adobe的Acrobat交换信息,可以和数据库交换信息。

      XML表示的结构化数据。对于大型复杂的文档,xml是一种理想语言,不仅允许指定文

      档中的词汇,还允许指定元素之间的关系。比如可以规定一个author元素必须有一个

      name子元素。可以规定企业的业务必须有包括什么子业务。

      XML文档。XML文档有DTD和XML文本组成,所谓DTD(DocumentTypeDefinition),

      简单的说就是一组标记符的语法规则.,表明XML文本是怎么样组织的,比如DTD可以

      表示一个必须有一个子标记,可以有或者没有子标记等等。当

      然一个简单的XML文本可以没有DTD。下面是一个简单的xml文本。

      version=”1.0”standalone=”yes”>haha其中以?开始并结尾的

      是进程说明。Standalone表示外围设备。这里外围设备可以理解为该XML文本没有应用

      其他的文件。因为XML文件可以外部应用DTD等外部数据。

      XML涉及的一些技术。

      XSL和CSS。

      通过前面的介绍可以知道,XML可以定义信息的内容,却没有定义信息该如何表达,

      这实际上就是XML的长处,它把内容和形式分离了,这样同一个内容可以有不同的表达,

      相信随着XML应用的提高,那种“建议你使用800x600分辨率“的会消失。而XML内容

      的表达就是通过XSL(XMLStyleLanguage)和CSS(CascadingStyleSheets层叠样式

      表)来实现。拿前一个例子来说,可以为该xml文档定义的样式表(XSL)如下:

      这就是一个简单的XSL文件,

      利用msxsl可以生成html文件。如下

      haha至于CSS,在HTML文件中就已

      经有它的影子了,例如H1{font-size:12pt;font-weight:bold;}这就是一段简

      单的CSS的文本。XMLSchema尽管DTD给标记的使用加了限制,但是对于XML的自动

      处理却还需要更加严格更全面的工具。比如DTD不能保证一个标记的某个属性的值必须

      不为负值,于是出现了XMLSchema,由于XMLSchema(不同于DTD)本身也是一个正规的

      8

      重庆交通学院二OO五届毕业设计(论文)•说明书

      XML文档,因此开发者可以使用相同的工具处理其同其他的XML的信息交换。最初XML

      Schema由Microsoft提出,W3C的专家们经过充分讨论和论证,在1999年的2月,发

      布了一个需求定义,说明Schema必须符合的要求,5月,W3C完成并发布了Schema的

      定义。目前,IE5中的XML解析器能够根据文档类型定义(DTD)或XMLSchema解析XML关

      于DOM即DocumentObjectModel,它把XML文档的内容实现为一个对象模型,简单的

      说就是应用程序如何访问XML文档,W3C的DOMLevel1定义了如何实现属性、方法、

      事件等。

      关于XSLTXSLT即XMLStylesheetLanguageTransformation.在写本文时正式标

      准还没有正式形成,在1999年的11月通过了《XSLT》。XSLT是一种用来进行XML文档

      间相互转化的语言。简单的说,我们知道不同的开发者对于各自的应用会用不同的XML

      文档,利用XSLT我们可以从一个已经定义的XML文档抽取我们需要的数据,组成不同

      的形式,可以是XML,HTML和各种不同的SCRIPT。

      关于Xpointer和Xlinks

      类似于HTML中的er和Xlink用于联结其他的XML文档和其

      他XML文档中的部分,其中Xpointer相当于HTML中用于定位HTML文档子内容的锚!

      不过其联结水平更强大。比如,在bookstore中,可以定位到有一个作者叫金庸,书中

      有四大恶人的那本书,在HTML中,这是不可能实现的。

      当然,XML的发展促使了许多的新技术的出现,其他的还有RDF、Xfrom等等,其中

      的大部分W3C只是给出了建议,还没有形成正式的标准,有些内容甚至还处于讨论阶段。

      我们将密切注视着方面内容的变化。

      XML框架

      所谓框架即Framework。XML是一个通用的标准。它不属于个人,认证它的也不是

      一家公司,而是W3C。那么为什么那么多的大公司纷纷趋指如鹜呢?各家公司互相竞争

      的是它的framework,是它的mework是驾驭XML文件的结构,是一种

      高层次的结构控制。利用XMLframework,可以把商业逻辑(businesslogic)分离出

      来,实现数据与计算的分离。目前著名的framework有Microsoft的Biztalk以及联合

      国(UN/CEFACT)和OASIS联合于99年底推出了EBXML动议。相信在不久的将来会有许

      多的Framwork.其中的一个问题就是在W3C中关于XML的很多东西还处于建议的时候,

      就推出framework,是不是一种冒险。不过,互联网的发展似乎就是这样,关于framwwork

      的发展,我们将拭目以待。

      1.2.3XML的应用

      在对XML的主要技术做了一个简要的讲述之后,本节将对XML的应用——尤其是XML

      在企业电子商务中的应用进行介绍。

      一、XML在行业中的应用

      前面讲过,XML作为元语言,用户可以用它的定义自己行业的语言,例如数学领域

      的MathML、化学领域的CML等。

      1.数学标记语言MathML

      在HTML中标记复杂数学公式的通常做法是:用专门的工具编辑公式,并将其存为

      图象格式后在插入网页中。但W3C的数学工作组制定的MathML使得在网络上表达数学

      公式非常方便,人们可以利用MathML中定义的标记来表达复杂的数学公式。

      2.化学标记语言CML

      9

      重庆交通学院二OO五届毕业设计(论文)•说明书

      通过由PeterMurry-Rust开发的化学标记语言CML,化学家可以创建和发布分子结

      构,并在Web上显示以方便交流,但使用CML的最大好处在于可以在CML知识库中查找

      符合某种特性的分子。

      3.可扩展超文本标记语言XHTML

      W3C引入XHTML来连接HTML和XML。XHTML是采用XML1.规范对HTML4.0进行的重

      新阐述。即过去用SGML定义的HTML,改用XML来重新定义,以使真正的XML文档在现

      有的浏览器中显示。

      4.手持设备标记语言HDML

      HDML是由W3C制定的手持设备标记语言,是一种为显示屏的手持设备定义类似

      超文本内容和应用的简单语言。HDML通过WWW为手机、呼机、无线PDA等手持设备提供

      高效的服务。HDML的重点在于内容的表现与布局。

      5.无线标记语言

      WML是WAP论坛制定的一个基于XML的移动通信设备的标记语言。它是定义如何在

      手机等具有较小显示屏幕的无线设备上进行Web浏览及制定用户界面的语言。通过WML

      能够在手机等无线设备上显示信息、发送信息。虽然WML源于W3C制定的手持设备标记

      语言HDML,但其得到了众多厂商的支持。因此,与HDML相比,其应用更为广泛。

      6.同步多媒体综合语言SMIL

      SMIL是用语描述多媒体演示文档的语言,它可以将一披独立的多媒体对象集成为一

      个同步的多媒体岩演示稿,利用SMIL能够让使用者决定在什么时间以什么方式播放什

      么样的媒体文件。

      除了上述介绍的XML应用外,XNL的应用还有很多的。如由W3C制定的显示二维及

      矢量/栅格图形的可缩放矢量图形语言SVG,OEB组织制定的eBook文档结构标准——开

      放电子书结构规放OEB等众多应用。

      二、XML在企业中的应用

      XML在企业中的应用主要指企业通过XML技术进行电子商务。

      与EDI

      在电子商务出现之前,在商务伙伴之间交换电子数据采用的传统技术有几是十年历

      史的电子数据交换(EDI)技术。EDI将商业文件,例如定单、发票、货运单、报关单等

      按统一的标准,编制成计算机能够识别和处理的数据格式,然后在通过专线连接的计算

      机之间进行数据传输。但是传统的EDI技术由于其需要建设专用网络、投入巨大的局限,

      只能应用与少数大企业。XML自其诞生之日以来,由于其具有可扩展性、自描述性、自

      相容性等特点,得到了企业界的广泛关注。一方面,相关组织与企业纷纷制定了基于XML

      的非EDI信息交换的标准和协议。另一方面,为了保护原来企业在EDI上的巨大投资,

      人们将传统的EDI与XML相结合,形成了XML_EDI。

      2.基于XML的电子商务标准

      从技术上说,电子商务就是通过专用的网络或Internet进行商务数据的传输和交

      换,并根据数据进行相应的处理。因此,从技术的角度而言,电子商务的关键在于数据

      见换。而XML是至今为止用来做数据交换最有效的语言之一。XML通过标签来描述数据,

      而标签的含义是可以在DTD或Schema中事先定义。因此,不同行业的人们根据自己应

      用数据习惯定义了不同的标签,形成诸如BizTalk、cXML、ebXML等一系列具有行业特

      性的电子商务标准。基于这些标准的数据,都能通过XML解吸器进行解析,然后通过专

      用的网络或Interner进行业务数据的传输和交换。

      BizTalk

      10

      重庆交通学院二OO五届毕业设计(论文)•说明书

      BizTalk是微软公司倡导的标准,是利用Internet标准协议和格式来促进企业内部

      和企业间的音乐眼集成电子商务的XML框架,吸引了包括XMLSolutions再内的全球许

      多组织的支持。

      BizTalk提供了公用的Schema库,配套产品为微软的BizTalk服务器。是

      微软公司和其他公司一起合作的资助的营利性网站,供人们学习和了解XML和BizTalk,

      同时同时还提公用的Schema库。任何个人和组织都能向该网站提交他们的Schema,一

      旦通过认证测试,就可以成为有效Schema提供人免费下载使用。

      ebXML

      ebXML是联合国UN/CEFACT小组和OASIS共同发起指定的基于XML的全球范围的电

      子商务数据交换标准。ebXML具体规定了商务流程、项目及规则等企业进行电子商务的

      相关内容。

      cXML

      cXML即CommerceXML,她是由Ariba公司制定的一种基于XML的规范,面向B2B模

      式电子商务交易的行业标准。它在众多的电子商务中抽象出一种以定单为中心、并紧密

      围绕供货方和采购方的交易模型,另外还定义了一种信息交换的机制,进而完成定单的

      采购、处理与交运一系列过程。

      cnXML

      cnXML是中国科学院软件所电子商务研究中心制定的中国电子商务语言规范,其晌

      午流程定义参照国际标准的OBI购买模型。cnXML的目标是基于XML技术建立一个符合

      中国大陆商业习惯、传统和商业流程的电子商务语言规范,提供一套统一、灵活、开放

      并且可扩充的数据交换格式,是贸易的个方能够方便地通过电子网络进行各种商业活

      动。

      除了上述提及的电子商务标准外,还有众多的基于XML的电子商务标准,例如电子

      元器行业的RosettaNet、基于XML的人力资源管理的HR—XML。

      3.基于XML电子商务标准的选择

      面对众多的基于XML的电子商务标准,企业如何进行选择?标准最终是为企业提高

      生产效率而由人制定的。因此,在对基于XML的电子商务标准进行选择时,应充分考虑

      企业的实际需求,在解决自己的问题时,参考比较本行业内的各种标准。在选择标准的

      同时,也应该注意优化自己的内部管理流程,只有把企业内部的所有运作——包括人事、

      财务、生产、进货、销售的管理优化,并与本行内的各种基于XML的电子商务标准进行

      结合比较后,才能做出有利于企业发展、有利于提高促进生产效率的正确选择。

      1.3MFC简介

      MFC:MicrosoftFoundationClasses的简称。

      C++程序是以一个个类堆砌起来的,为了节省程序员的负担,几乎每一家编译器厂

      商都会提供一套现成的类库(classlibraries),让程序员在此基础上开发应用软件。

      MFC就是这样一套类库。如果以面向对象的严格眼光来看,MFC是比类库更高一级的所

      谓applicationframework。PC上另两套与MFC同等地位的产品是Borland的OWL和

      IBM的OpenClassLibrary,前者搭配的开发环境是BorlandC++,后者搭配的是

      VisualAgeC++,其他的C++编译器大厂如Watcom和Symantec和Metaware,并没有开发

      自己的类库,他们向微软取得MFC的使用授权,提供MFC的原始码、头文件、兼容的编

      译器和联结器。

      11

      重庆交通学院二OO五届毕业设计(论文)•说明书

      1.3.1C++类库

      当今,Windows操作系统和面向对象编程被广泛应用,C++语言因为C语言的极大成

      功和作为语言的自然过度而成为面向对象编程语言的首选。由于Windows应用程序的复

      杂性,要想一切从头开始编写所有的C++代码,这几乎是不了思议的;而且,面向对象

      编程的好处就在于代码的可重复性上,因此,一般的编程的做法是选择一套已定义好的

      公认的C++类库及其集成开发环境,这样可以做到事半功倍。

      在当今的PC世界里,有三套C++类库及其集成开发环境是大公认的的好成品,一是

      Microsoft公司的MFC(MicrosoftFoundationClasses)类库及其VisualC++软件,

      而是Borland公司的OWL(ObjectWindowLibrary)类库及其C++Builder软件,三是

      IBM公司的OCL(OpenClassLibrary)类库及其VisualAgeC++软件。其他一些C++软

      件厂商,如Watcom、Symatec、Metaware,只是提供集成开发环境,其C++类库是采用

      Microsoft公司的MFC。

      C++类库帮助我们把APLs利用面向对象的原理逻辑地组织起来,使它们具备封装性、

      继承性、多态性和抽象化、模块化的性质。因此,在一个集成化的开发环境中,使用已

      经公认的定义好的C++类库,派生自己应用程序所需要的各种类或直接定义其对象,构

      成一个有机的应用程序结构,是C++面向对象编程的主要方法。

      1.3.2应用程序框架

      所谓应用程序框架(ApplicationFramework),就是应用程序所应具备的一般性软

      件模块按一定的结构组成的集合。基于MFC的应用程序框架是定义了程序结构的MFC类

      库中的集合。运用MFC应用程序框架能获得标准化的程序结构和用户接口,极大地减轻

      你的负担,使你不必过多地考虑用户界面,而把主要精力放在程序设计上,以提高程序

      设计的效率。

      应用程序框架实际上是一个完整的程序模型,具备标准应用软件所需要的一切基本

      功能,例如文件存取、打印预览、数据交换、窗口排列等,以及这些功能的使用接口(工

      具栏、状态栏、菜单、对话框等)。有了应用程序框架之后,你只要依个人需要在派生

      类中改写虚函数,定义新的数据成员,用资源编辑器增加或修改用户界面,进行消息映

      射、定义新类就行了,MFC类来实现框架中未完成的应用程序的特定功能部分。

      MFC应用程序向导可为使用MFC的典型Windows应用程序建立开发项目,提供了一

      系列的对话框及多种选项供用户选择,用户可以根据不同的选项生成自己需要的具有各

      种特征的应用程序框架,具体方法如下。

      选择“文件/新建/项目”命令,在“新建项目”对话框中选择项目类型为“MFC应

      用程序”。在“位置”文本框中输入项目的名称,如Prog1,单击“确定”按钮后弹出“MFC

      应用程序向导”对话框。

      该对话框是一个标签式对话框包括8个标签,分别为:概述、应用程序类型、复合

      文档支持,文档模板字符串、数据库支持、用户界面功能、高级功能和生成的类。

      1.3.3应用程序类型

      从“MFC应用程序向导”对话框创建应用程序框架的对话框中可以看出,创建一个

      12

      重庆交通学院二OO五届毕业设计(论文)•说明书

      应用程序是时有许多种选择,不同的选择会导致生成不同的应用程序类型,MFC应用程

      序向导自动为其生成的类和相应文件是不同的,并且在创建之后是不便修改的,如想把

      SDI改为MDI,或是想增加OLE支持等,这都不能实现。若要变更程序,只有两条路可

      走:要不就令MFC应用程序向导重新产生一个新的程序框架,然后把原程序中已添加的

      可用内容以Copy/Paste方式移植过来;要不就是直接进入原程序修修补补。至于移植

      或修补过程中到底会出现什么错误,那就不一定了。所以,在开始程序代码具体编写之

      前,务必小心做好系统分析的工作。

      13

      重庆交通学院二OO五届毕业设计(论文)•说明书

      第二章系统介绍

      2.1系统概述

      1.系统名称:XML语言的可视图化编辑器

      2.系统目标:

      本系统能够结合W3C公布的XML规范和指定的XMlLSchema的XML文档设计。

      我们选择的是初始模型是XMLSchema,用来描叙最一般的XML文档,为了支持一个

      完整的XMLSchema、框架,在逻辑部分,我们采用功能强大的MSXMLPARSER,可以保

      证在完整的XMLSchema范围内编辑和验证Schema以及这些Schema编辑的XML。

      在界面部分,我们详细研读了XMLSCHEMA的规范,可以保证任何符合完整的schema

      以及基于这些schema编辑的XML可以准确的显示,而且提供给用户的见面提示也覆盖

      完整的XMLSCHEMA的。用户在编辑XML的时候,可以随时看见XML的DOM树结构,并

      在树结构上进行编辑和修改,为用户提供了XML数据元素的层次结构演示。方便了用户

      查看和修改。

      3、界面介绍:

      本设计所要实现的XML语言的可视化编辑器的界面是一个多文档界面窗口,有四个

      主要部分组成,分别是主窗口主界面、右视图即属性控制条、左视图即DOM控制条,和

      报错控制条。如下图所示:

      14

      重庆交通学院二OO五届毕业设计(论文)•说明书

      3、系统的层次结构

      系统总体分为三层:

      1.最上面层为用户界面层,负责显示和接受用户信息。

      2.中间层为DOM逻辑层,利用MSXMLPARSER解析xml文件,将用户的界面操作转换为

      对xml文件的修改。

      3.最下层为文件系统层,是真正的xml文本文件。

      系统整体三层设计思想如下图:

      DOM

      XML文档

      15

      重庆交通学院二OO五届毕业设计(论文)•说明书

      2.2可行性研究

      本系统我们初步设想采用vc++6.0+msxml解析器的单机板模式实现。从XML文件中

      获得信息最好的办法是利用XML解析器。解析器,简单的讲,就是一个软件,它可以使

      XML文件中的数据易于使用。作为VC的开发者,你可能想得到一个支持DocumentObject

      Model(DOM)的解析器。DOM描述了一系列标准的访问XML和HTML文档的方法,这些方

      法解析器应该实现。一个支持DOM的解析器应该把XML中的数据变成一系列对象,这样

      就可以对这些对象二次编程。下一步关键如何利用Microsoft解析器()实

      现的DOM结构访问和维护XML文档。

      XMLDOM(文档对象模型)对象提供了一个标准的方法来操作存储在XML文档中的信

      息,这就是DOM应用编程接口(API)函数。它是应用程序和XML文档之间的桥梁。DOM

      包含两个关键的抽象概念:一个是树状的层次结构,另一个是用来表示文档内容和结构

      的节点集合。树状层次包括了所有节点,节点本身也可以包含其他的节点。这样的好处

      是可以通过这个层次结构来找到并修改某一特定节点的信息。

      微软的MSXML解析器读取一个XML文档,然后把它的内容解析到一个抽象的信息容

      器中(DOM),该信息容器被称为节点(NODES)。这些节点代表文档的结构和内容,并允

      许应用程序来操作文档中的信息而不需要知道XML的语义。

      对开发人员来说,最重要的编程DOM对象是DOMDocument。DOMDocument对象通过

      暴露的属性和方法来允许浏览、查询和修改XML文档的内容和结构。

      这说明本系统在技术上是可行的。

      16

      重庆交通学院二OO五届毕业设计(论文)•说明书

      第三章XML解析器

      3.1XML解析器简介

      一、简介

      解析器的主要功能就是检查XML文件是否有结构上的错误,剥离XML文件中的标记,读

      出正确的内容,以交给下一步的应用程序处理。XML是一种用来结构化文件信息的标记

      语言,XML规范中对于如何标记文件的结构性有一个详细的法则,解析器就是根据这些

      法则写出来的软件。同HTML一样,在浏览器中,必须有HTML的解析器,这样浏览器才

      能够“读懂”各种用HTML标记所组成的网页,将它们显示在我们面前。如果有浏览器

      的HTML解析器读不懂的标记,将会返回给我们错误信息。

      二、解析器可以分为以下几种:

      1、验证或非验证解析器

      2、支持DocumentObjectModel(DOM)的解析器

      3、支持SimpleAPIforXML(SAX)的解析器

      4、特定语言编写的解析器(Java,C++,Perl等)

      三、验证和非验证解析器

      XML文档使用一个DTD并符合DTD中的规则将被称为有效文档(valid

      document)。符合基本标记规则的XML文档被称为格式正确文档(well-formed

      document)。

      XML规范要求所有的解析器当其发现一个文档不是格式正确时要报错。

      验证(Validation)则是另一个问题了。验证解析器(Validatingparser)在解析XML

      文档同时进行验证。非验证解析器(Non-validatingparser)忽略所有的验证错误。

      如果一个XML文档是格式正确的时,一个非验证解析器并不关注文档是否符合其

      对应DTD所指定的规则(如果有的话)。

      使用非验证解析器的原因

      主要是因为速度和效率。要一个XML解析器处理DTD并确保每个XML的元素符

      合在DTD中的规则需要相当大的开销。如果确定一个XML文档是有效的,那就没有必

      要再次验证它了。

      同样,有时您所需要的只是从一个文档中找出XML的标记。一旦您有了这些标记,

      您可以将数据从中提取出然后加以处理。如果这就是您所需要的,一个非验证解析器就

      是正确的选择。

      3.2DOM

      DOM乃由W3C定义,全称为DocumentObjectModel。和DOM有关的主要有DOM规

      范和基于DOM的XMLParser。

      17

      重庆交通学院二OO五届毕业设计(论文)•说明书

      3.2.1DOM概述

      DOM规范指的一份文档,在这份文档根据"基于树"的思想中定义了一种对象模型,

      这种对象模型将一份结构化文档用对象树的形式表达出来。

      按照DOM规范提供二次开发接口的XMLParser软件包称为基于DOM的XMLParser,

      区别于基于SAX的XMLParser。

      DOM的思想也称为"基于树的(treebased)",因为其主要想法是一次性将一篇结

      构化文档全部解析,然后生成一个对象树(objecttree)用以描述该文档。之后对于

      该文档的所有操作(如修改、查询等),均在该对象树上进行。从"基于树"这点上看,

      DOM和动态HTML(DymanicHTML)非常相象,而且DOM受到DHTML的影响非常深。

      文档对象模型(DocumentObjectModel)是WorldWideWebConsortium(W3C)的

      正式推荐。它定义了一个接口使得程序可以存取和更新XML文档的风格、结构和内容。

      支持DOM的XML解析器实现该接口。

      当您用一个DOM解析器来解析一个XML文档时,您将获得一个包含文档中所有元

      素的树结构。DOM提供了不同的功能来检查文档的内容和结构。

      3.2.2DOM解析器的原理

      遵循DOM规范开发的XMLParser的使用是自然的:首先初始化一个Parser,然后

      将一篇文档提交处理,Parser处理后返回一颗对象树。然后所有对文档的操作均对这颗

      树进行。在这个过程中,对象树和其操作等,均遵循DOM规范的规定。因此,遵循标准

      DOM接口的XMLParser是具有良好的重用特性的。

      由于含有对象的概念,DOM天生就是为面向对象的程序语言指定的。其规范中也以

      Java语言作为示例语言。

      需要指出的是,DOM并不是一个二进制的规范(abinaryspecification),所以,

      只有对于特定的编程语言才有意义。例如,对于C++程序员来说,用Java写的XMLParser

      只有参考价值。

      3.3SAX

      SAX,全称SimpleAPIforXML,即是指一种接口,也是指一个软件包。

      作为接口,SAX是事件驱动型XML解析的一个标准接口(standardinterface),已

      被OASIS(OrganizationfortheAdvancementofStructuredInformationStandards)

      所采纳。

      3.3.1SAX概述

      SAX作为软件包,SAX最早的开发始于1997年12月,由一些互联网分散的程序员

      合作进行。后来,参与开发的程序员越来越多,组成了互联网上的XML-DEV社区。五个

      月以后,1998年5月,SAX1.0版由XML-DEV正式发布。今年5月,XML-DEV社区又发

      布了最新的SAX2.0。2.0版本在多处与1.0版本不兼容,包括一些类和方法的名字。

      SAXAPI是另一种处理XML文档内容的方法。

      当您使用SAX解析器来解析XML文档时,解析器在文档的不同处将产生事件。SAX

      18

      重庆交通学院二OO五届毕业设计(论文)•说明书

      解析器会在以下情况下产生事件:在文档开始和结束时,在一个元素开始和结束时,或

      者它在一个元素中找到字符时,以及其它若干点。

      使用SAX时,只需将精力集中在事件处理函数的编写上即可。如果使用的是非面向

      对象语言,如C,则需要将程序员自行开发的事件处理函数作为参数传递给SAXParser。

      如果使用的是面向的语言,则需要重载SAX包中原有的事件响应函数。

      3.3.2SAX解析器的原理

      SAX的工作原理是:Parser顺序扫描文档,扫描到文档(document)开始与结束、

      元素(element)开始与结束等地方时通知事件处理函数(handler),由事件处理函数

      做相应动作,然后继续同样的扫描,直至文档结束。例如,对于如下文档:

      Hello,world!

      在解析的过程中会产生如下一系列事件:

      startdocument

      startelement:doc

      startelement:para

      characters:Hello,world!

      endelement:para

      endelement:doc

      enddocument

      3.4DOM和SAX的关系

      SAX(SimpleAPIforXML)和DOM(DocumentObjectModel)都是为了让程序

      员不用写一个解析器就可以访问他们的资料信息。通过利用XML1.0格式保存信息,以

      及使用SAX或者DOMAPIs你的程序可以使用任何解析器。这是因为使用他们所喜爱的

      语言开发解析器的开发者必须实现SAX和DOMAPIs。SAX和DOMAPIs对多种语言中都

      可以实现(Java,C++,Perl,Python,其它...)。

      所以SAX和DOM都是为了同样的目的而存在,这就是使用户可以利用任何编程语言

      访问存入XML文档中的信息(要有一个那种编程语言的解析器)。虽然他们在提供给你访

      问信息的方法上大不相同。

      3.4.1DOM与SAX的优缺点比较

      DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因

      此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下

      导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。

      另一方面,在内存中构造这样的树涉及大量的开销。大型文件完全占用系统内存容量的情况并

      不鲜见。此外,创建一棵DOM树可能是一个缓慢的过程。

      19

      重庆交通学院二OO五届毕业设计(论文)•说明书

      SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的

      数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储

      在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个

      文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代

      者DOM快许多。

      另一方面,由于应用程序没有以任何方式存储数据,使用SAX来更改数据或在数

      据流中往后移是不可能的。

      选择DOM还是选择SAX,这取决于下面几个因素:

      1.应用程序的目的:如果打算对数据作出更改并将它输出为XML,那么在大多数情况下,

      DOM是适当的选择。并不是说使用SAX就不能更改数据,但是该过程要复杂得多,因

      为您必须对数据的一份拷贝而不是对数据本身作出更改。

      2.数据容量:对于大型文件,SAX是更好的选择。数据将如何使用:如果只有数据中

      的少量部分会被使用,那么使用SAX来将该部分数据提取到应用程序中可能更好。另

      一方面,如果您知道自己以后会回头引用已处理过的大量信息,那么SAX也许不是恰

      当的选择。

      3.对速度的需要:SAX实现通常要比DOM实现更快。SAX和DOM不是相互排斥的,可

      以使用DOM来创建SAX事件流,也可以使用SAX来创建DOM树。事实上,用于创建

      DOM树的大多数解析器实际上都使用SAX来完成这个任务。

      3.4.2选择DOM的原因

      处理的XML文档包含文档数据(FramemakerdocumentsstoredinXMLfort),那

      么DOM就是解决方案的最自然选择。如果要创建一些类似于文档信息管理的系统,那么

      就不得不处理大量的文档数据。DOM可以索引和组织各种类型文档资源中的信息。在这

      种情况下,DOM是非常合适程序去访问存贮在这些文档中的信息的。

      DOM可以让你以分层次对象模型来访问储存在XML文档中的信息。DOM生成一棵节

      点树你可以通过这棵树来访问你的信息。在XML文档中的文本信息转变成一组树的节点。

      不管XML文档中的信息的类型(不管是表格数据,或是一列items,或者只是文

      档),DOM在你创建一个XML文档的文档对象时创建一棵节点树。DOM使用树状模型去

      访问XML文档中的信息。这种模式确实不错因为XML原本就是分层次的。这也是DOM为

      什么可以把你的信息放到一棵树中的原因。因为在DOM中,每一个元素节点实际上都有

      一系列的其他节点作为它的孩子。这些孩子节点可以包含文本值或者是其他元素节点。

      如果每个元素只有值的话,这确实是没有必要的。但是,元素可能含有文本数据或者其

      他元素;这是在DOM中做额外的工作来获取元素节点值的原因。通常文档中只有纯数据

      时,把所有的数据压成一个“块“放到字串中并让DOM把那个字串当成某个特定元素节

      点的值返回是适当的。这种方式并不适合XML文档中的数据,在文档中,元素的顺序是

      非常重要的。对于纯数据元素的顺序是不要紧的。之所以DOM保持从XML文档中读出

      的元素的顺序,因为它把所有的事物都当成文档来处理。文档对像模型的叫法由此而

      来。这就是我们选择DOM原因。

      3.4.3关于DOM规范

      DOM的规范(specification)现有两层。LevelOne的草案于1997年10月公布,

      正式文档于1998年10月发布(publishedasW3Ccandidaterecommendation)。Level

      20

      重庆交通学院二OO五届毕业设计(论文)•说明书

      Two于1998年12月提出草案,1999年12月定稿,今年3月审核期(reviewperiod)

      结束,5月发布正式文档。新的LevelThree已于今年9月1日发布第一份草案(draft)。

      DOM新发布的每一层都对以前DOM进行了内容上的扩充和更新。

      DOMLevelOne在结构上分为两段,其中DOM(Core)定义了用于描述XML的DOM接

      口,DOMHTML描述了用于HTML的DOM。

      DOMLevelOne主要描述了三部分内容,它们分别是:

      1)定义了用于表达和操作(representandmanipulate)一份结构化文档的接口

      (interface)和对象(object)。

      2)这些接口和对象的语法,包括其行为和属性(behaviorandattributes)。

      3)这些接口和对象之间的关系与协同关系(relationshipsandcollaborations)。

      DOMLevelTwo在LevelOne的基础上增加的内容包括:文档的抽象视(abstract

      view)、对象树的遍历(traversal)、文档中的块(Range)、风格页(genericstylesheets)、

      层叠式风格页(CascadingStyleSheets)等内容。另外,更重要的是,LevelTwo增加

      了对事件机制(event)的支持。事件机制在LevelOne中完全没有被定义。

      需要注意的是,DOMLevelTwo中所说的事件(event)和SAX的事件驱动

      (eventdriven)中的事件,虽然名称相同,但涵义完全不同。DOM2中的事件,指的是

      结构化文档内部所定义的事件,比如页面被加载时的OnLoad事件等,和Parser无关。

      而SAX中的事件,指的是XMLParser在解析XML文档时产生的回调(callback)事件,

      和文档本身无关。

      LevelThree在写这份资料综述时刚刚发布草稿,故未及细究。从W3C公布的草案

      来看,第三层的主要目标(goal)是进一步加强和扩充LevelTwo新出现的事件机制。

      21

      重庆交通学院二OO五届毕业设计(论文)•说明书

      第四章MSXMLParser的使用

      4.1MSXMLPARSER的概念

      XML毕竟只是一种规范了格式的标记语言,如果没有程序对它进行处理的话,它只

      是一个保存了很多数据的、有一定格式的文本文件而已。为了能够让计算机“读”懂XML

      的内容并做出进一步工作,程序就要先分析XML文件的结构和各个数据之间的关系。MS

      XMLParser就是Microsoft开发的解析XML文件的一系列接口,借助于它的帮助,程序

      员可以方便地利用提供的接口来分析XML文件。

      Microsoft已经发布了MSXML3.0Parser,而第四个版本(现在改名为微软XML

      还心服务,MicrosoftCoreServices),也分别再2001年10月发布。

      4.1.1XMLParser的功能

      XML的parser发展为两类:一种是"非确认类paeser",只检测文档是否遵守XML

      语法规则,是否用元素标识建立了文档树。另一种是"确认类paeser",它不但检测文档

      语法,结构树,而且比较解析你使用的元素标识是否遵守了相应DTD文件的规范。

      Parser能独立使用,也可以成为编辑软件或浏览器的一部分。在后面的相关资源列

      表里,我列出了当前比较流行的一些parsers。

      XMLParser是一个提供给程序员二次开发的软件包。程序员在使用XMLParser时,

      调用其包中提供的接口(如函数接口等),从而得到解析的结果。功能比较完善的XML

      Parser在解析XML文档的同时还能完成有效性检验等相关任务。使用已有的XMLParser,

      能使程序员在处理与XML的解析相关的事务时节省大量的精力,因而是一种符合软件工

      程中代码重用思想的软件包。

      XMLParser遵循一定的标准,以XMLParser如何回应(feedback)调用者的方式

      来分,可以分成两大类:事件驱动类(event-driven)和对象模型类(objectmodel)。

      前者的代表是SAX(SimpleAPIforXML),后者的代表是DOM(DocumentObjectModel)。

      DOM出现的比较早,但SAX的运行性能更好。

      XMLParser可以用多种高级语言实现,也可以被用于多种高级语言的二次开发。这

      些语言包括:C、C++、Tcl、Perl、Python以及Java。其中,尤以Java为甚,C/C++其

      次。由于Perl是GNU的,所以用这两种语言书写的XMLParser也相当多。Python是近

      几年新出现的一种完全面向对象的、解释型的高级语言,由于出现较晚,所以相应的XML

      Parser不多。

      C/C++的XMLParser一般以DLL或ActiveX的形式发布(distribute),少量非商

      业产品附源码。在商业性的C++XMLParser中,IBM发布的xml4c2的影响较大,微软

      也已经发布了MSXML,其中含有一个XMLParser。

      Java的XMLParser一般以Jar包的形式发布,绝大多数都附有源码。商业产品较

      少,多为OpenSource的。由于Java语言本身的优越性,Java的XMLParser在使用上

      22

      重庆交通学院二OO五届毕业设计(论文)•说明书

      比C/C++的XMLParser更方便。

      具体功能如下:

      1、能从文件加载XML或是保存XML到文件。

      2、能方便遍历文档的各个数据。

      3、能够修改XML文档,如删除数据、增加数据和修改数据等。

      4、能检查文档格式是否合法,即检查是否符合W3C的XML1.0标准。

      5、能根据DTD判断文档数据的有效性。

      6、支持命名空间。

      7、只能用在MSWindows平台(当然,这是个缺点)。

      由于是有Microsoft开发的,它必然比较容易地在MicrosoftVisualStudio系列

      的开发工具中使用,如VisualBasic和VisualC++等。

      4.1.2MSXMLParser的使用

      遵循DOM规范开发的XMLParser的使用是自然的:首先初始化一个Parser,然后

      将一篇文档提交处理,Parser处理后返回一颗对象树。然后所有对文档的操作均对这颗

      树进行。在这个过程中,对象树和其操作等,均遵循DOM规范的规定。因此,遵循标准

      DOM接口的XMLParser是具有良好的重用特性的。

      由于含有对象的概念,DOM天生就是为面向对象的程序语言指定的。其规范中也以

      Java语言作为示例语言。

      需要指出的是,DOM并不是一个二进制的规范,所以,只有对于特定的编程语言才

      有意义。

      为了更加熟练的处理XML文档,必须使用XMLparser。MicrosoftXMLparser是

      IIS5.0所带的一个COM组件,一旦安装了IIS5.0,parser可以利用HTML文档和ASP

      文件中的脚本。MicrosoftXMLDOMparser支持以下编程模式:

      1、支持javascript,VBScript,Perl,VB,Java,C++等等

      2、支持W3CXML1.0和XMLDOM

      3、支持DTD和validation

      XMLDOM对象提供了一个标准的方法来操作存储在XML文档中的信息,DOM应用编

      程接口(API)用来作为应用程序和XML文档之间的桥梁。

      DOM可以认为是一个标准的结构体系用来连接文档和应用程序(也可以是脚本语

      言)。MSXML解析器允许你装载和创建一个文档,收集文档的错误信息,得到和操作文档

      中的所有的信息和结构,并把文档保存在一个XML文件中。DOM提供给用户一个接口来

      装载、到达和操作并序列化XML文档。DOM提供了对存储在内存中的XML文档的一个完

      全的表示,提供了可以随机访问整个文档的方法。DOM允许应用程序根据MSXML解析器

      提供的逻辑结构来操作XML文档中的信息。

      实际上MSXML解析器根据XML文档生成一个DOM,它能够读XML文档并根据XML文

      档内容创建一个节点的逻辑结构,文档本身被认为是一个包含了所有其他节点的节点。

      DOM使用户能够把文档看成是一个有结构的信息树,而不是简单的文本流。这样即

      使不知道XML的语义细节,应用程序或者是脚本也能够方便地操作该结构。DOM包含两

      个关键的抽象:一个树状的层次、另一个是用来表示文档内容和结构的节点集合。树状

      层次包括了所有这些节点,节点本身也可以包含其他的节点。这样的好处是对于开发人

      23

      重庆交通学院二OO五届毕业设计(论文)•说明书

      员来说,他可以通过这个层次结构来找到并修改相应的某一个节点的信息。DOM把节点

      看成是一个通常的对象,这样就有可能创建一个剧本来装载一个文档,然后遍历所有的

      节点,显示感兴趣的节点的信息。注意节点可以有很多中具体的类型,比如元素、属性

      和文本都可以认为是一个节点。

      微软的MSXML解析器读一个XML文档,然后把它的内容解析到一个抽象的信息容器

      中称为节点(NODES)。这些节点代表文档的结构和内容,并允许应用程序来读和操作文

      档中的信息而不需要显示知道的XML的语义。在一个文档被解析以后,它的节点能够在

      任何时候被浏览而不需要保持一定的顺序。

      4.2DOM的接口

      在DOM接口规范中,有四个基本的接口:Document,Node,NodeList以及

      NamedNodeMap。在这四个基本接口中,Document接口是对文档进行操作的入口,它是从

      Node接口继承过来的。Node接口是其他大多数接口的父类,象Documet,Element,

      Attribute,Text,Comment等接口都是从Node接口继承过来的。NodeList接口是一个

      节点的集合,它包含了某个节点中的所有子节点。NamedNodeMap接口也是一个节点的集

      合,通过该接口,可以建立节点名和节点之间的一一映射关系,从而利用节点名可以直

      接访问特定的节点。下面将对这四个接口分别做一些简单的介绍。

      4.2.1DOM接口简介

      1、Document接口代表了整个XML/HTML文档,因此,它是整棵文档树的根,提供了

      对文档中的数据进行访问和操作的入口。

      由于元素、文本节点、注释、处理指令等都不能脱离文档的上下文关系而独立存在,

      所以在Document接口提供了创建其他节点对象的方法,通过该方法创建的节点对象都

      有一个ownerDocument属性,用来表明当前节点是由谁所创建的以及节点同Document

      之间的联系。

      Document节点是DOM树中的根节点,也即对XML文档进行操作的入口节点。通过

      Docuemt节点,可以访问到文档中的其他节点,如处理指令、注释、文档类型以及XML

      文档的根元素节点等等。另外,从上图我们还可以看出,在一棵DOM树中,Document

      节点可以包含多个处理指令、多个注释作为其子节点,而文档类型节点和XML文档根元

      素节点都是唯一的。

      关于Document接口的IDL(InterfaceDefinitionLanguage接口定义语言)定义

      和其中一些比较常用的属性和方法的详细介绍在许多参考书都可以找到,我们将在后面

      结合实际例子给予介绍。

      2、

      Node

      接口在整个

      DOM

      树中具有举足轻重的地位,

      DOM

      接口中有很大一部分

      接口是从Node接口继承过来的,例如,Element、Attr、CDATASection等接口,都是

      从Node继承过来的。在DOM树中,Node接口代表了树中的一个节点。Node接口提

      供了访问

      DOM

      树中元素内容与信息的途径,并给出了对

      DOM

      树中的元素进行遍历的

      支持。

      24

      重庆交通学院二OO五届毕业设计(论文)•说明书

      3

      、NodeList接口提供了对节点集合的抽象定义,它并不包含如何实现这个节点集

      的定义。NodeList用于表示有顺序关系的一组节点,比如某个节点的子节点序列。另外,

      它还出现在一些方法的返回值中,例如GetNodeByName。

      在DOM中,NodeList的对象是"live"的,换句话说,对文档的改变,会直接反映到

      相关的NodeList对象中。例如,如果通过DOM获得一个NodeList对象,该对象中包含

      了某个Element节点的所有子节点的集合,那么,当再通过DOM对Element节点进行操

      作(添加、删除、改动节点中的子节点)时,这些改变将会自动地反映到NodeList对

      象中,而不需DOM应用程序再做其他额外的操作。

      NodeList中的每个item都可以通过一个索引来访问,该索引值从0开始。

      4、实现了NamedNodeMap接口的对象中包含了可以通过名字来访问的一组节点的集

      合。NamedNodeMap并不是从NodeList继承过来的,它所包含的节点集中的节点是无序

      的。尽管这些节点也可以通过索引来进行访问,但这只是提供了枚举NamedNodeMap中

      所包含节点的一种简单方法,并不表明在DOM规范中为NamedNodeMap中的节点规定了

      一种排列顺序。

      NamedNodeMap表示的是一组节点和其唯一名字的一一对应关系,这个接口主要用在

      属性节点的表示上。与NodeList相同,在DOM中,NamedNodeMap对象也是"live"的。

      4.2.2MSXML的COM接口

      所包括的主要的COM接口有:

      (1)DOMDocument

      对开发人员来说,最重要的编程对象是DOMDocument。DOMDocument对象通过

      暴露属性和方法来允许浏览、查询和修改XML文档的内容和结构,每一个接下来的对

      象暴露自己的属性和方法,这样就能够收集关于对象实例的信息,操作对象的值和结构,

      并导航到树的其他对象上去。

      DOMDocument对象是XMLDOM的基础,你可以利用它所暴露的属性和方法来允许你

      浏览、查询和修改XML文档的内容和结构。DOMDocument表示了树的顶层节点。它实现

      了DOM文档的所有的基本的方法并且提供了额外的成员函数来支持XSL和XSLT。它创建

      了一个文档对象,所有其他的对象都可以从这个文档对象中得到和创建。

      (2)IXMLDOMNode

      IXMLDOMNode是文档对象模型(DOM)中的基本的对象,元素,属性,注释,过程指令

      和其他的文档组件都可以认为是IXMLDOMNode,事实上,DOMDocument对象本身也是一

      个IXMLDOMNode对象。

      (3)IXMLDOMNodeList

      IXMLDOMNodeList实际上是一个节点(Node)对象的集合,节点的增加、删除和变化

      都可以在集合中立刻反映出来,可以通过“”结构来遍历所有的节点。

      (4)IXMLDOMParseError

      IXMLDOMParseError接口用来返回在解析过程中所出现的详细的信息,包括错误号,

      行号,字符位置和文本描述。

      25

      重庆交通学院二OO五届毕业设计(论文)•说明书

      4.3接口对象方法举例

      在DOM中的每个对象拥有特定的属性或方法,或两者都有。我们可以直接地使用

      这些属性和方法来取得信息并运用XML数据。下面完整地介绍XML对象模型,并检视这

      些对象和相关的属性与方法。

      4.3.1Document对象

      以下为常用的Document对象属性的说明:

      1、async属性

      表示是否允许异步的下载。

      基本语法:

      boolValue=;=boolValue;

      说明:布尔值是可擦写的(read/write),如果准许异步下载,值为True;反之则为False。

      2、attribute属性

      传回目前节点的属性列表。

      基本语法:

      objAttributeList=utes;

      说明:传回一个物件。如果此节点不能包含属性,则传回空值。

      3、childNodes属性

      传回一个节点清单,包含该节点所有可用的子节点。

      基本语法:

      objNodeList=odes;

      说明:传回一个物件。假如这节点没有子节点,传回null。

      4、documentElement属性

      确认XML文件的根(Root)节点。

      基本语法:

      objDoc=ntElement;

      说明:回一个在单一根文件元素中包含数据的对象。此属性可读/写,如果文件中不包

      含根节点,将传回null。

      5、firstChild属性

      确认在目前节点中的第一个子元素。

      基本语法:

      objFirstChild=hild;

      说明:此属性只读且会传回一对象,如果节点中没有包含第一个子元素,将传回null。

      6、lastChild属性

      确认目前节点中最后的子元素。

      基本语法:

      objLastChild=ild;

      26

      重庆交通学院二OO五届毕业设计(论文)•说明书

      说明:此属性只读且传回一个对象。如果节点中没有包含最后子元素,将传回null。

      7、nextSibling属性

      在目前文件节点的子节点列表中传回下一个兄弟节点。

      基本语法:

      objNextSibling=bling;

      说明:此属性是只读且传回一个对象。如果节点中没有包含其它的相关节点,会传回

      null。

      8、nodeName属性

      传回代表目前节点名称的字符串。

      基本语法:

      strNodeName=me;

      说明:传回一个字符串。这个属性是只读的,传回元素名称、属性或实体参照。

      ownerDocument属性

      传回文件的根节点,包含目前节点。

      基本语法:

      objOwnerDoc=ocument;

      说明:此属性是只读的,传回一个包含文件根节点的对象,包含特定的节点。

      9、parentNode属性

      传回目前节点的父节点。只能应用在有父节点的节点中。

      基本语法:

      objParentNode=Node;

      说明:此属性是只读的,传回包含指定节点的父节点对象。如果此节点不存在于文件树

      中,将传回null。

      10、parseError属性

      传回一个DOM解析错误对象,此对象描述最后解析错误的讯息。

      基本语法:

      objParseErr=rror;

      说明:此属性是只读的。如果没有错误发生,将传回0。

      11、previousSibling属性

      传回目前节点之前的兄弟节点。

      基本语法:

      objPrevSibling=usSibling;

      说明:传回一个对象,这个属性是只读的。若该节点没有包含前面的兄弟节点,会传回

      null。

      以下为Document对象常用方法的说明:

      1、abort方法

      abort方法取消一个进行中的异步下载。

      基本语法:

      27

      重庆交通学院二OO五届毕业设计(论文)•说明书

      ();

      说明:如果这个方法在异步下载时被呼叫,所有的解析动作会停止,而且在内存中的文

      件会被释放。

      2、AppendChild方法

      加上一个节点当作指定节点最后的子节点。

      基本语法:

      Child(newChild);

      说明:newChild是附加子节点的地址。

      3、createAttribute方法

      建立一个指定名称的属性。

      基本语法:

      Attribute(name);

      说明:name是被建立属性的名称。

      4、createElement方法

      建立一个指定名称的元素。

      基本语法:

      Element(tagName);

      说明:tagName是一个区分大小写的字符串来指定新元素名称。

      5、createNode方法

      建立一个指定型态、名称,及命名空间的新节点。

      基本语法:

      Node(type,name,nameSpaceURI);

      说明:type用来确认要被建立的节点型态,name是一个字符串来确认新节点的名称,

      命名空间的前缀则是选择性的。nameSpaceURI是一个定义命名空间URI的字符串。如

      果前缀被包含在名称参数中,此节点会在nameSpaceURI的内文中以指定的前缀建立。

      如果不包含前缀,指定的命名空间会被视为预设的命名空间。

      6、createTextNode方法

      建立一个新的text节点,并包含指定的数据。

      基本语法:

      TextNode(data);

      说明:data是一个代表新text节点的字符串。一个新的text节点被建立,但是没有

      加到文件树中。若要将节点加到文件树中,必须使用插入方法,例如:insertBefore,

      replaceChild或appendChild。

      7、getElementsByTagName方法

      传回指定名称的元素集合。

      基本语法:

      objNodeList=mentsByTagName(tagname);

      说明:tagname是一个字符串,代表找到的元素卷标名称。使用tagname"*"传回文件

      28

      重庆交通学院二OO五届毕业设计(论文)•说明书

      中所有找到的元素。

      8、insertBefore方法

      在指定的节点前插入一个子节点。

      基本语法:

      objDocumentNode=Before(newChild,refChild);

      说明:newChild是一个包含新子节点地址的对象,refChild是参照节点的地址。新子

      节点被插到参照节点之前。如果refChild参数没有包含在内,新的子节点会被插到子

      节点列表的末端。

      9、load方法

      表示从指定位置加载的文件。

      基本语法:

      boolValue=(url);

      说明:url包含要被加载档案的URL的字符串。假如文件加载成功,传回值即为true。

      若加载失败,传回值为false。

      10、loadXML方法

      加载一个XML文件或字符串的片断。

      基本语法:

      boolValue=L(xmlString);

      说明:xmlString是包含XML文字码的字符串。这个字符串可以包含整个文件或者只是

      一个文件片断。如果文件加载成功,传回值为true。假如加载失败,传回值则是false。

      11、removeChild方法

      会将指定的节点从节点清单中移除。

      基本语法:

      objDocumentNode=Child(oldChild);

      说明:oldChild为一个包含要被移除的节点对象

      12、replaceChild方法

      置换指定的旧子节点为提供的新子节点。

      基本语法:

      objDocumentNode=eChild(newChild,oldChild);

      说明:newChild为包含新子节点的对象。如果此参数为null,则此旧子节点会被移除

      而不会被取代。oldChild为包含旧子节点的对象。

      13、selectNodes方法

      传回所有符合提供样式(pattern)的节点。

      基本语法:

      objDocumentNodeList=Nodes(patternString);

      说明:patternString为一包含XSL样式的字符串。此方法会传回节点清单对象,包含

      符合样式的节点。如果没有符合的节点,则传回空的清单列表。

      14、selectSingleNode方法

      传回第一个符合样式的节点。

      基本语法:

      29

      重庆交通学院二OO五届毕业设计(论文)•说明书

      objDocumentNode=SingleNode(patternString);

      说明:patternString为一包含XSL样式的字符串。此方法会传回第一个符合的节点对

      象,如果没有符合的节点,则传回null。

      4.3.2Node对象

      以下为常用Node对象的属性说明:

      1、text属性

      取得或设定节点的文字。

      基本语法:

      strText=;=strText;

      说明:此属性为一可供读写的字符串值。

      以下为Node对象常用方法的说明:

      1、hasChildNodes方法

      如果指定的节点有一个以上的子节点则传回true。

      基本语法:

      boolValue=ldNodes();

      说明:此一方法只读且会传回一布尔值。

      2、appendChild方法

      返回对象(Element)。返回被添加对象的引用。

      基本语法:

      oElement=Child(Node)

      说明:将Node添加为object的最后一个子对象。即object的childNodes集合的

      最后一项。

      3、removeChild方法

      返回被删除对象的引用。

      基本语法:

      Element=Child(oChild)

      说明:从object的子对象中删除oChild。

      oChild为object的直系子对象。即必须为object的children集合中的一项。

      删除oChild时,oChild的所有子对象将被一起删除。

      4、replaceChild方法

      返回被替换对象的引用。

      基本语法:

      oElement=eChild(oNewNode,oChild)

      说明:用oNewNode替换object的子对象oChild。

      oChild为object的直系子对象。即必须为object的children集合中的一项。当

      oChild被替换时,所有与之相关的属性内容都将被移除。

      30

      重庆交通学院二OO五届毕业设计(论文)•说明书

      4.3.3NodeList对象

      length属性是nodeList对象的唯一属性。没有应用,不做说明。

      下面是nodeList对象常用方法说明:

      1、item方法

      存取文件树中的单一节点。

      基本语法:

      objDocumentNode=(index);

      说明:index为长整数指定子节点的index(0-based)。

      2、nextNode方法

      存取集合中的下一个节点。

      基本语法:

      objDocumentNode=de();

      说明:传回包含下一个节点的对象。若无法取得下一个节点则传回null。

      4.3.4parseError对象

      以下为parseError对象常用属性的说明:

      1、errorCode属性

      传回最后一个解析错误的错误码。

      基本语法:

      intErrorValue=ode;

      说明此一属性只读且会传回一长整数。

      2、filePos属性

      传回档案中错误发生的位置。

      基本语法:

      intErrorValue=s;

      说明:此一属性只读,且会传回表示绝对位置的长整数(以字符数表示)。

      3、line属性

      传回错误发生所在的行数。

      基本语法:

      intErrorValue=;

      说明此一属性只读,且会传回表示错误发生所在行数的长整数。

      4、linePos属性

      传回错误发生在行中的哪个位置。

      基本语法:

      intErrorValue=s;

      说明:此一属性只读,且会传回一长整数表示错误发生在行中的哪一个字符位置。

      31

      重庆交通学院二OO五届毕业设计(论文)•说明书

      5、reason属性

      传回最后一个错误发生的原因。

      基本语法:

      strErrorReason=;

      说明:此一属性只读,且会传回最后一个解析错误发生原因的叙述字符串。

      srcText属性

      传回错误发生处该行的文字。

      基本语法:

      strSrcText=t;

      说明:此一属性只读。传回错误发生处该行完整的文字,而且包含空格。

      32

      重庆交通学院二OO五届毕业设计(论文)•说明书

      第五章MSXML解析的实现

      5.1解析流程

      在解析过程中,首先创建一个解析器实例,然后创建Document对象,之后读取文

      档。解析器会把文档中的内容解析为一棵元素树,可以通过Document对象提供的接口

      对文档中的内容进行添加、删除、修改、保存等操作。

      5.1.1流程图

      XML文件

      解析器

      创建Document对象并加载文档

      s

      e

      t

      A

      t

      t

      r

      i

      b

      u

      t

      e

      N

      o

      d

      c

      r

      e

      a

      t

      e

      T

      e

      x

      t

      N

      o

      d

      e

      c

      r

      e

      a

      t

      e

      T

      e

      x

      t

      N

      o

      d

      e

      G

      e

      t

      n

      o

      d

      e

      T

      y

      p

      e

      S

      t

      c

      r

      e

      a

      t

      e

      A

      t

      t

      r

      i

      b

      u

      t

      e

      a

      p

      p

      e

      n

      d

      C

      h

      i

      l

      d

      i

      n

      s

      e

      r

      t

      B

      e

      f

      o

      r

      e

      G

      e

      t

      i

      t

      e

      m

      L

      o

      a

      d

      33

      S

      a

      v

      e

      ……

      重庆交通学院二OO五届毕业设计(论文)•说明书

      5.1.2解析器的初始化

      通过智能指针创建一个解析器的实例

      CComPtrspXMLDOM;

      HRESULThr=teInstance(__uuidof(DOMDocument));

      创建Document对象

      HRESULThr;

      IXMLDomDocument*pXMLDoc;

      IXMLDOMNode*pXDN;

      //COM的初始化

      hr=CoInitialize(NULL);

      /*得到关于IXMLDOMDocument接口指针pXMLDOC*/

      hr=CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPPROC_SERVER,IID_IXM

      LDOMDocument,(void**)&pXMLDoc);

      //得到关于IXMLDOMNode接口的指针pXDN

      hr=pXMLDoc->QueryInterface(IID_IXMLDOMNode,(void**)&pXDN);

      5.2

      MSXML

      的解析处理

      利用DOM,可以动态地创建XML、遍历文档、增加/删除/修改/保存文档内容。DOM

      提供的API与编程语言无关,所以对一些DOM标准中没有明确定义的接口,不同解析器

      的实现方法也可能有所差别。解析器初始化后首先要装载文档,下面装载了D盘目录下

      的文件,首先设置了一个bSuccess参数,如果它的返回值为True则装载

      成功。

      VARIANT_BOOLbSuccess=false;

      hr=spXMLDOM->load(CComVariant(“D:"),&bSuccess);

      5.2.1添加兄弟节点

      说明

      一、判断该节点是否为文本节点,会用到IXMLDOMNode::Getitem方法,然后根据

      GetnodeTypeString来判定该节点类型.

      二、根据输入信息来创建文本节点会用到IXMLDOMNode::createTextNode(data)方法,

      34

      重庆交通学院二OO五届毕业设计(论文)•说明书

      语法如下:

      HRESULTcreateTextNode(BSTRdata,IXMLDOMText**text);

      三、把该新节点添加到XMLDOM中会用到XMLDOMNode对象的insertBefore方法,语法

      如下:oXMLDOMNod->insertBefore(newChild,refChild);

      重要代码段:

      voidxmlTreeCtrl::OnMENUITEMaddxd()

      {

      MSXML2::IXMLDOMTextPtrtextnode;

      MSXML2::IXMLDOMElementPtrelementnode;

      ……

      if(IDOK==dlg_l())

      {

      ……

      HTREEITEMsel=GetParentItem(GetSelectedItem());

      HTREEITEMhTmpItem;

      if(m_zjjdtext!="")

      {

      try{

      textnode=m_xmlDoc->createTextNode(_bstr_t(m_zjjdtext));

      elementnode=m_xmlDoc->createElement(_bstr_t(m_zjjdbq));

      elementnode->appendChild(textnode);

      m_CurrentNode->parentNode->appendChild(elementnode);

      hTmpItem=InsertItem(m_zjjdbq,0,1,sel);

      hTmpItem=InsertItem("nodevalue:"+m_zjjdtext,0,1,hTmpItem);

      }

      catch(_com_error&e){

      app->m_pMainFrame->m_String(0,(TCHAR*)

      essage());

      MessageBox((TCHAR*)essage(),"出错提示",MB_OK);

      return;

      }

      }

      else

      {

      try{

      35

      重庆交通学院二OO五届毕业设计(论文)•说明书

      elementnode=m_xmlDoc->createElement(_bstr_t(m_zjjdbq));

      m_CurrentNode->parentNode->appendChild(elementnode);

      hTmpItem=InsertItem(m_zjjdbq,0,1,sel);

      }

      catch(_com_error&e){

      app->m_pMainFrame->m_String(0,(TCHAR*)

      essage());

      ……

      }

      }

      }

      }

      5.2.2添加子节点

      说明:

      一、程序得到添加节点对话框的输入数据信息,用此信息创建一个新的节点,该操作会

      用到XMLDOMDocument对象的createNode和createTextNode方法,首先创建一个节点,

      函数如下:

      HRESULTcreateNode(VARIANTType,BSTRname,BSTRnamespaceURI,IXMLDOMNode

      **node);

      HRESULTcreateTextNode(BSTRdata,IXMLDOMText**text);

      二、然后把该新节点添加到所选节点下,作为其子节点,该操作会用到

      XMLDOMDocument::appendChild(newChild)方法,具体语法如下:

      HRESULTappendChild(IXMLDOMNode*newChild,IXMLDOMNode**outNewChild);

      三、添加成功,更新右视图,让树控件显示该节点,该操作会用到CTreeCtrl类的

      InsertItem方法,函数如下:

      HTREEITEMInsertItem(LPCTSTRlpszItem,intnImage,intnSelectedImage,

      HTREEITEMhParent=TVI_ROOT,HTREEITEMhInsertAfter=TVI_LAST);

      36

      重庆交通学院二OO五届毕业设计(论文)•说明书

      重要代码段:

      voidxmlTreeCtrl::OnMENUITEMaddzn()

      {

      MSXML2::IXMLDOMTextPtrtextnode;

      MSXML2::IXMLDOMElementPtrelementnode;

      ……

      if(IDOK==dlg_l())

      {

      ……

      {

      try{

      textnode=m_xmlDoc->createTextNode(_bstr_t(m_zjjdtext));

      elementnode=m_xmlDoc->createElement(_bstr_t(m_zjjdbq));

      elementnode->appendChild(textnode);

      m_CurrentNode->appendChild(elementnode);

      }

      catch(_com_error&e){

      app->m_pMainFrame->m_String(0,(TCHAR*)

      essage());

      MessageBox((TCHAR*)essage(),"出错提示",MB_OK);

      return;

      }

      hTmpItem=InsertItem(m_zjjdbq,0,1,sel);

      hTmpItem=InsertItem("nodevalue:"+m_zjjdtext,0,1,hTmpItem);

      }

      else

      {

      try{

      elementnode=m_xmlDoc->createElement(_bstr_t(m_zjjdbq));

      }

      catch(_com_error&e){

      app->m_pMainFrame->m_String(0,(TCHAR*)

      essage());

      MessageBox((TCHAR*)essage(),"出错提示",MB_OK);

      return;

      }

      m_CurrentNode->appendChild(elementnode);

      hTmpItem=InsertItem(m_zjjdbq,0,1,sel);

      }

      }

      ……

      }

      37

      重庆交通学院二OO五届毕业设计(论文)•说明书

      5.2.3添加文本节点

      说明:

      一、判断该节点有无文本子节点,会用到IXMLDOMNode的Getitem方法,然后根据

      GetnodeTypeString来判定该节点类型;判断该节点本身是否为文本节点,用节点本身

      的GetnodeTypeString方法来判定该节点类型。

      二、用对话框中得到的信息来创建文本节点会用到IXMLDOMNode::createTextNode方

      法,函数如下:

      HRESULTcreateTextNode(BSTRdata,IXMLDOMText**text);

      三、添加文本节点并更新树

      m_CurrentNode->appendChild(textnode);

      InsertItem("nodevalue:"+m_zj_text,0,1,GetSelectedItem());

      重要代码段:

      voidxmlTreeCtrl::OnMENUITEMaddtext()

      {

      MSXML2::IXMLDOMTextPtrtextnode;

      CXmleditApp*app=(CXmleditApp*)AfxGetApp();

      ……

      if(strcmp(m_CurrentNode->GetnodeTypeString(),"text")==0)

      ……

      if

      (strcmp(m_CurrentNode->childNodes->Getitem(i)->GetnodeTypeString(),"text")=

      =0)

      ……

      try{

      textnode=m_xmlDoc->createTextNode(_bstr_t(m_zj_text));

      m_CurrentNode->appendChild(textnode);

      InsertItem("nodevalue:"+m_zj_text,0,1,GetSelectedItem());

      }

      catch(_com_error&e){

      app->m_pMainFrame->m_String(0,(TCHAR*)

      essage());

      38

      重庆交通学院二OO五届毕业设计(论文)•说明书

      ……

      }

      }

      }

      5.2.4删除节点

      说明:

      一、根据提示对话框的返回值确定是否继续执行删除节点操作

      if(IDYES==MessageBoxEx(NULL,"确定要删除该节点吗?","提示信息

      ",MB_YESNO,1))

      如果是则继续,否则返回。

      二、根据属性节点的名字关联XMLDOM属性节点,确定删除,此过程会用到XMLDOMElement

      对象的parentNode()和removeChild方法,语法如下:

      HRESULTremoveChild(IXMLDOMNode*childNode,

      IXMLDOMNode**outOldChild);

      重要代码段:

      voidxmlTreeCtrl::OnMENUITEMdel()

      {

      if(m_CurrentNode!=NULL)

      {

      if(strcmp(m_CurrentNode->GetnodeTypeString(),"element")==0)

      {

      ……

      try{

      MSXML2::IXMLDOMNodePtr

      pnode=m_CurrentNode->parentNode->removeChild(m_CurrentNode);

      }

      catch(_com_error&e){

      app->m_pMainFrame->m_String(0,(TCHAR*)

      essage());

      }

      DeleteItem(GetSelectedItem());

      39

      重庆交通学院二OO五届毕业设计(论文)•说明书

      return;

      }

      elsereturn;

      }

      }

      ……

      }

      5.2.5替换节点

      说明:用弹出对话框得到的信息来创建的新节点来替换该节点,操作中要用到

      XMLDOMNode::replaceChild方法,语法如下:

      HRESULTreplaceChild(IXMLDOMNode*newChild,IXMLDOMNode*oldChild,IXMLDOMNode

      **outOldChild);

      重要代码段:

      voidxmlTreeCtrl::OnMENUITEMreplace()

      {

      MSXML2::IXMLDOMTextPtrtextnode;

      MSXML2::IXMLDOMElementPtrelementnode;

      ……

      try{

      textnode=m_xmlDoc->createTextNode(_bstr_t(m_zjjdtext));

      elementnode=m_xmlDoc->createElement(_bstr_t(m_zjjdbq));

      elementnode->appendChild(textnode);

      m_CurrentNode->parentNode->replaceChild(elementnode,m_CurrentNode);

      DeleteItem(GetSelectedItem());

      hTmpItem=InsertItem(m_zjjdbq,0,1,sel);

      hTmpItem=InsertItem("nodevalue:"+m_zjjdtext,0,1,hTmpItem);

      }

      ……

      }

      }

      40

      重庆交通学院二OO五届毕业设计(论文)•说明书

      else

      {

      try{

      elementnode=m_xmlDoc->createElement(_bstr_t(m_zjjdbq));

      m_CurrentNode->parentNode->replaceChild(elementnode,m_CurrentNode);

      DeleteItem(GetSelectedItem());

      hTmpItem=InsertItem(m_zjjdbq,0,1,sel);

      }

      catch(_com_error&e){

      app->m_pMainFrame->m_String(0,(TCHAR*)

      essage());

      MessageBox((TCHAR*)essage(),"³ö´íÌáʾ",MB_OK);

      return;

      }

      }

      }

      }

      5.2.6替换文本节点

      说明:

      一、判断该节点是否为文本节点,要用到XMLDOMNode::GetnodeTypeString()的方法,

      如果返回值为text、把该节点的text值传递给替换文本对话框,要用到XMLDOMNode

      对象的text属性。函数如下:

      dlg_text.m_dqjd=(constchar*)m_CurrentNode->text;

      二、用替换文本对话框中得到的信息来创建一个text节点并替换当前所选节点,函数

      如下:

      textnode=m_xmlDoc->createTextNode(_bstr_t(m_zj_text));

      m_CurrentNode->parentNode->replaceChild(textnode,m_CurrentNode);

      三、更新DOM树中的信息,函数如下:

      InsertItem("nodevalue:"+m_zj_text,0,1,GetParentItem(GetSelectedItem()));

      41

      重庆交通学院二OO五届毕业设计(论文)•说明书

      DeleteItem(GetSelectedItem());

      重要程序段:

      voidxmlTreeCtrl::OnMENUITEMrplctext()

      {

      MSXML2::IXMLDOMTextPtrtextnode;

      ……

      if(strcmp(m_CurrentNode->GetnodeTypeString(),"text")!=0)

      {

      ……

      }

      ……

      try{

      textnode=m_xmlDoc->createTextNode(_bstr_t(m_zj_text));

      m_CurrentNode->parentNode->replaceChild(textnode,m_CurrentNode);

      InsertItem("nodevalue:"+m_zj_text,0,1,GetParentItem(GetSelectedItem()));

      DeleteItem(GetSelectedItem());

      }

      catch(_com_error&e){

      app->m_pMainFrame->m_String(0,(TCHAR*)

      essage());

      MessageBox((TCHAR*)essage(),"错误提示",MB_OK);

      return;

      }

      }

      5.2.7属性修改

      说明:

      一、把该属性节点的信息传递给修改属性对话框,要用到CListCtrl::GetItemText方

      42

      重庆交通学院二OO五届毕业设计(论文)•说明书

      法,函数如下:

      text=GetItemText(sel,0);

      dialog_mdfsx.m_dqsxjd=A;(Attr代表信息)

      二、根据修改属性对话框中得到的信息来修改属性值,操作过程中要用到

      XMLDOMElement::setAttribute方法,函数如下:

      HRESULTsetAttribute(BSTRname,VARIANTvalue);

      重要代码段:

      voidxmlListCtrl::OnMENUITEMmdfsxz()

      {

      MSXML2::IXMLDOMAttributePtrattrnode;

      CStringm_dqsx;

      CStringm_dqsxz;

      intsel=GetNextItem(-1,LVNI_SELECTED);

      CStringtext=GetItemText(sel,0);

      CXmleditApp*app=(CXmleditApp*)AfxGetApp();

      ……

      try{

      pnode->setAttribute(_bstr_t(text),_bstr_t(m_dqsxz));

      }

      catch(_com_error&e)

      {

      app->m_pMainFrame->m_String(0,(TCHAR*)

      essage());

      ……

      }

      SetItemText(sel,1,m_dqsxz);

      }

      43

      重庆交通学院二OO五届毕业设计(论文)•说明书

      第六章结束语

      6.1总结

      经过三个多月的设计和开发,XML可视化编辑器开发完毕。其功能基本符合需求,

      能够完成XML的编辑,对DOM树的添加节点,删除节点等操作,以及对其属性值和属

      性名的修改等;并很好的做到了开发软件中的团队精神。

      但是由于毕业设计时间较短以及我们的能力有限等原因,我们的XMLEDIT还有许

      多不尽如人意的地方,比如不会检查元素名和属性名是否有效,输出是否符合schema

      或者DTD等多方面问题。这些都有待进一步改善。

      6.2致谢

      在本次毕业设计中,我从指导老师闫果老师身上学到了很多东西。闫老师认真负

      责的工作态度,严谨的教学精神和深厚的理论水平都使我收益匪浅。他无论在理论上

      还是在实践中,都给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学

      习都有一种巨大的帮助,感谢他细心而又耐心的辅导。

      另外,在软件开发过程中,同组的同学给予我很大的帮助,解决了不少的难点,

      使得软件能及时开发完成,在此表示我诚挚的谢意。

      44

      重庆交通学院二OO五届毕业设计(论文)•说明书

      参考文献

      主要参考资料:

      [1]《XML示例程序导学》第二版,BenoitMarchal著,杨洪涛、顾雷、郑震坤译,清

      华大学出版社。

      [2]《XML编程技术大全》,,等著,康博译,清华大学出版社。

      [3]《XML网页开发技术》,李宋编著,西安电子科技大学出版社。

      [4]《XML技术精粹》,胡海静、王育平等编著,机械工业出版社。

      [5]《XML编程实现》,都志辉主编,清华大学出版社。

      [6]《VisualC++项目开发实践》,李强、贾云霞编著,中国铁道出版社。

      [7]《VisualC++6.0教程》,JonBates,TimTompkins著,何健辉,董方鹏等译。

      [8]《C++面向对象程序设计》,王萍编著,清华大学出版社。

      [9]《C++XML高级编程指南》,FabioArciniegas著,武磊,刘栓强译,北京希望电

      子出版社。

      [10]《XML技术大全》,HeaterWilliamson著,智慧东方工作室译,机械工业出版社。

      参考网站:

      XML官方网站

      XML中国官方网站

      中国万维网联盟

      中国XML论坛

      45

      本文标签: 节点文档对象语言数据