· XML文档对象 XML
文档既是一种对象,同时又代表整个XML
文档。它由根元素和子元素组成。
· XML节点对象 XML节点对象代表的是XML文档内部的节点,如元素、注释、名字空间等。
· XML节点列表 XML文档模块
列表代表了节点的集合。
利用DOM,开发人员可以动态地创建XML文档,遍历结构,添加、修改、删除内容等。其面向对象的特性,
使人们在处理XML解析相关的事务时节省大量的精力,是一种符合代码重用思想的强有力编程工具。
三、MSXML
从理论上说,根据XML的格式定义,我们可以自己编写一个XML的语法分析器,但实际上微软已经给我们提供了一个XML语法解析器,
即一个叫做MSXML.DLL的动态链接库,实际上它是一个COM(Component Object Model)对象库,里面封装了进行XML解析时所需要的所有对象。
因为COM是一种以二进制格式出现的和语言无关的可重用对象,
所以你可以用任何语言(比如
VB,VC,DELPHI,C++ Builder甚至是剧本语言等等)对它进行调用,在你的应用中实现对XML文档的解析。
MSXML.DLL所包括的主要COM接口有:
1. DOMDocument
DOMDocument对象是XML DOM的基础,你可以利用它所暴露的属性和方法来浏览、查询和修改XML文档的内容和结构。
DOMDocument表示了树的顶层节点,它实现了DOM文 档的所有的基本方法,并且提供了额外的成员函数来支持XSL和XSLT。
它创建了一个文档对象,所有其他的对象都可以从这个
文档对象中得到和创建。
2. IXMLDOMNode
IXMLDOMNode是文档对象模型(DOM)中的基本对象,元素、属性、注释、过程指令和其他的文档组件都可以认为是IXMLDOMNode
。事实上,DOMDocument对象本身也是一个IXMLDOMNode对象。
3. IXMLDOMNodeList
IXMLDOMNodeList实际上是一个节点(Node)对象的集合,节点的增加、删除和变化都可以在集合中立刻反映出来,
可以通过"for...next"结构来遍历所有的节点。
4. IXMLDOMParseError
IXMLDOMParseError接口用来返回在解析过程中所出现的详细的信息,包括错误号、行号、字符位置和文本描述。
在具体应用时可以用DOMDocument的Load方法来装载XML文档,
用IXMLDOMNode 的selectNodes(查询的结果有多个,
得到存放搜索结果的链表)或selectSingleNode(
查询的结果有一个,在有多个的情况下返回找 到的第一个节点)方法进行查询,
用createNode和appendChild方法来创建节点和追加节点,用IXMLDOMElement的 setAttribute和getAttribute方法来设置和获得节点的属性。
四、
程序实现
下面通过一个具体的实例来说明在VC++中如何利用MSXML解析XML文档。
(1)源XML文档(xmlfile.xml)如下:
<?xml version="1.0" encoding="GB2312"?>
<Device id="10041" name="设备1">
<Type>13</Type>
<TypeName>保护</TypeName>
</Device>
我们在源文档中查找"Device",将其"name"属性设置为"测试设备",为其添加"Model"节点,并设置其文本为"3"。
(2)源程序如下:
CoInitialize(NULL); // 初始化COM。
CComPtr<IXMLDOMDocument> spXMLDOM;
HRESULT hr=spXMLDOM.CoCreateInstance (_uuidof(DOMDocument));
// 创建解析器实例。
VARIANT_BOOL bSuccess=false;
hr=spXMLDOM->load(CComVariant(L"xmlfile.
xml"),&;bSuccess);
// 装载XML文档。
CComBSTR bstrSS(L"Device");
CComPtr<IXMLDOMNode> spDevice;
hr=spXMLDOM->selectSingleNode(bstrSS,&;spDevice); //
搜索"Device"。
CComQIPtr<IXMLDOMElement> spDev;
spDev=spDevice;
// 设置"Device"的"name"属性。
hr= spDev ->setAttribute(CComBSTR(L"name"),CComVariant("测试设备"));
CComPtr<IXMLDOMNode> spModelNode; hr=spXMLDOM->createNode(CComVariant(NODE_ELEMENT),ComBSTR
("Model"