XML 概况
XML解析器介绍
搭建MSXML的使用环境
MSXML 中的DOM模型
XML 概况
可扩展标记语言(Extensible Markup Language 简写为XML)与HTML一样属于标准通用标记语言(Standard Generalized Markup Language 简写SGML)的子集。由于XML具有简洁有效、易学易用,是开放的国际化标准和高可扩展性等优点,所以可预见XML将被更为广泛地使用。
XML解析器介绍
为了在日常的工作中操作XML文件,我曾经也封装了一个XML的操作类。这个类可以完成添加节点,删除节点,修改节点的功能,但是我到现在还是没有找到一个方案封装查找节点的行为,由于存在一个这样的缺陷,所以也就一直不敢发表。封装的类底层操作是通过MSXML来完成,我只不过为众多常用的应用提供方便。MSXML提供了两种方式来解析XML,分别是DOM和SAX的方式,功能颇为强大丰富。当通过C++来使用MSXML时,因为会涉及到接口和智能指针等一些COM类型或者结构等,所以使用起来也须细心地照管好接口等,否则较容易出现未释放或者释放空指针等的错误。通过脚本语言来使用MSXML就很方便,我们不用再自己去照管接口等。在网页我们经常可以看见javascript使用MSXML来操作XML的例子。
在前阵子,我也经常使用CMarkup类。由于我使用的是免费的,这个类可以从网上下载。使用起来也非常简单直观,可以说易使用性相当高。毕竟是免费的,所以它的功能有限,存在不能删除节点的不足,如果在应用中要删除节点时就不适合了。所以在使用这个类时,我还是搭着自己封装的类来使用。
曾经,为项目组到底该应用哪种XML解析器而思虑了些日子,也曾去试过一些库。如TinyXml,它只支持DOM方式解析XML,就一般的应用来说基本上都是选DOM方式来操作XML。通过使用认为可以说它完全可以满足我们的需要,但是它支持char字符类型,这给应用带来了些麻烦,为了使用它我们必须为它传char字符,但我们在应用开发中都是要用TCHAR这种字符类型,经常的字符转换增加了复杂性。我真的希望它是支持UNICODE的,在网上也曾看过文章介绍如何让它支持UNICODE,可我还没有尝试过。
C++解析XML库除了上面列举的几种之外,还有ACE和Xerces。Xerces是一个开放源码的库,而且还支持SAX模型。这里主要介绍MSXML,如果应用程序要求在非 windows系统下运行,就不适应用MSXML。
搭建MSXML的使用环境
MSXML是Microsoft XML Core Services短语的缩写词。通过一组织良好的COM接口向用户提供操作XML的高效方法,COM服务器一般随着windows操作系统一起安装。COM服务器(这里是指msxml版号.dll)位于windows\System32目录下,这个目录下通常会有多个MSXML*.dll,在使用时可以根据需要而选择适当的服务器。关于各个版本的功能或者说差异可以查看相关的文档,一般来说后续的版本是以前版本的升级,功能上都有所增强。
由于MSXML是通过COM服务器来提供,在使用COM服务器时我们必须能知道其中接口和GUID等信息。目前,主要有以下几种方式来提供:(1)头文件,(2)tlb文件
(3)直接通过导入DLL的方式来得到。在帮助文档中介绍的是使用第三种方式,#import <msxml6.dll> 在导入时我们可以指定较多的选项,如命名空间,接口包装等等。我通常使用的是第三种方式。在导入之后,我们可以用原始的COM接口方式,也可以使用经过简单包装的智能接口来编写程序。在使用包赱的智能指针类时,为了不与SDK的Include目录中的msxml*.h中的定义冲突,在编写程序时可以使用带命名空间的方式访问,命名空间可以看debug目录的.tlh文件。
MSXML 中的DOM模型
MSXML的DOM模型编程接口主要有DOMDocument,IXMLDOMNode,IXMLDOMNodeList(节点集合),IXMLDOMNamedNodeMap(属性集合)。从下面这张图中可以看出有许多其它的接口IXMLDOMElement、IXMLDOMText等等,它们都是以IXMLDOMNode为基类。这些接口都可以与XML中的DOM元素都可以对应起来。IXMLDOMDocument就对应了XML文档,这个接口还实现持久化的接口。
XML中的DOM模型如下,这个图和xml摘自互联网。
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
IXMLDOMDocument对应整个文档,IXMLDOMElement对应<bookstore>,<book>,<title>,<ahutor>,<year>,<price>等。IXMLDOMText对应着Everyday Italian等及属性中的值。IXMLDOMAttribute对应着category="CHILDREN",属性节点中包含有IXMLDOMText节点。