MSXML使用教程
在DOM接口规范中,有四个基本的接口:Document,Node,NodeList以及NamedNodeMap。在这四个基本接口中,Document接口是对文档进行操作的入口,它是从Node接口继承过来的。Node接口是其他大多数接口的父类,象Documet,Element,Attribute,Text,Comment等接口都是从Node接口继承过来的。NodeList接口是一个节点的集合,它包含了某个节点中的所有子节点。NamedNodeMap接口也是一个节点的集合,通过该接口,可以建立节点名和节点之间的一一映射关系,从而利用节点名可以直接访问特定的节点。下面将对这四个接口分别做一些简单的介绍。
1、Document接口 Document接口代表了整个XML/HTML文档,因此,它是整棵文档树的根,提供了对文档中的数据进行访问和操作的入口。 由于元素、文本节点、注释、处理指令等都不能脱离文档的上下文关系而独立存在,所以在Document接口提供了创建其他节点对象的方法,通过该方法创建的节点对象都有一个ownerDocument属性,用来表明当前节点是由谁所创建的以及节点同Document之间的联系。 在DOM树中,Document节点是DOM树中的根节点,也即对XML文档进行操作的入口节点。通过Docuemt节点,可以访问到文档中的其他节点,如处理指令、注释、文档类型以及XML文档的根元素节点等等。另外,在一棵DOM树中,Document节点可以包含多个处理指令、多个注释作为其子节点,而文档类型节点和XML文档根元素节点都是唯一的。 关于Document接口的IDL(Interface Definition Language接口定义语言)定义和其中一些比较常用的属性和方法的详细介绍可以在MSDN中找到。 2、Node接口 Node接口在整个DOM树中具有举足轻重的地位,DOM接口中有很大一部分接口是从Node接口继承过来的,例如,Element、Attr、CDATASection等接口,都是从Node继承过来的。在DOM树中,Node接口代表了树中的一个节点。 3、NodeList接口 NodeList接口提供了对节点集合的抽象定义,它并不包含如何实现这个节点集的定义。NodeList用于表示有顺序关系的一组节点,比如某个节点的子节点序列。另外,它还出现在一些方法的返回值中,例如GetNodeByName。 在DOM中,NodeList的对象是"live"的,换句话说,对文档的改变,会直接反映到相关的NodeList对象中。例如,如果通过DOM获得一个NodeList对象,该对象中包含了某个Element节点的所有子节点的集合,那么,当再通过DOM对Element节点进行操作(添加、删除、改动节点中的子节点)时,这些改变将会自动地反映到NodeList对象中,而不需DOM应用程序再做其他额外的操作。 NodeList中的每个item都可以通过一个索引来访问,该索引值从0开始。 4、NamedNodeMap接口 实现了NamedNodeMap接口的对象中包含了可以通过名字来访问的一组节点的集合。不过注意,NamedNodeMap并不是从NodeList继承过来的,它所包含的节点集中的节点是无序的。尽管这些节点也可以通过索引来进行访问,但这只是提供了枚举NamedNodeMap中所包含节点的一种简单方法,并不表明在DOM规范中为NamedNodeMap中的节点规定了一种排列顺序。 NamedNodeMap表示的是一组节点和其唯一名字的一一对应关系,这个接口主要用在属性节点的表示上。 与NodeList相同,在DOM中,NamedNodeMap对象也是"live"的。
DOM是Document Object Model(文档对象模型)的简称,是对Web文档进行应用开发、编程的应用程序接口(API)。作为W3C公布的一种跨平台、与语言无关的接口规范,提供了在不同环境和应用中的标准程序接口,可以用任何语言实现。 采用对象模型和一系列的接口来描述XML文档的内容和结构,即利用对象把文档模型化。这种对象模型实现的基本功能包括: 描述文档表示和操作的接口; 接口的行为和属性; 接口之间的关系以及互操作。 可对结构化的文档进行解析,文档中的指令、元素、实体、属性等所有内容个体都用对象模型表示,整个文档被看成是一个有结构的信息树,而不是简单的文本流,生成的对象模型就是树的节点,对象同时包含了方法和属性。因此,对文档的所有操作都是在对象树上的进行。在中,树中的一切都是对象,不管是根节点还是实体的属性。 在中主要有以下三个对象: ·XML文档对象文档既是一种对象,同时又代表整个XML文档。它由根元素和子元素组成。 ·XML节点对象节点对象代表的是文档内部的节点,如元素、注释、名字空间等。 ·XML节点列表文档模块列表代表了节点的集合。 利用,开发人员可以动态地创建文档,遍历结构,添加、修改、删除内容等。其面向对象的特性,使人们在处理解析相关的事务时节省大量的精力,是一种符合代码重用思想的强有力编程工具。 三、MSXML 从理论上说,根据的格式定义,我们可以自己编写一个的语法分析器,但实际上微软已经给我们提供了一个语法解析器,即一个叫做MSXML.DLL的动态链接库,实际上它是一个COM(Component Object Model)对象库,里面封装了进行解析时所需要的所有对象。因为COM是一种以二进制格式出现的和语言无关的可重用对象,所以你可以用任何语言(比如VB,VCDELPHIC++ Builder甚至是剧本语言等等)对它进行调用,在你的应用中实现对文档的解析。 所包括的主要接口有: 1.DOMDocument DOMDocument对象是XML DOM的基础,你可以利用它所暴露的属性和方法来浏览、查询和修改文档的内容和结构。表示了树的顶层节点,它实现了文档的所有的基本方法,并且提供了额外的成员函数来支持XSL和XSLT。它创建了一个文档对象,所有其他的对象都可以从这个文档对象中得到和创建。 2.IXMLDOMNode IXMLDOMNode是文档对象模型(DOM)中的基本对象,元素、属性、注释、过程指令和其他的文档组件都可以认为是。事实上,对象本身也是一个对象。 3.IXMLDOMNodeList IXMLDOMNodeList实际上是一个节点(Node)对象的集合,节点的增加、删除和变化都可以在集合中立刻反映出来,可以通过"for...next"结构来遍历所有的节点。 4.IXMLDOMParseError IXMLDOMParseError接口用来返回在解析过程中所出现的详细的信息,包括错误号、行号、字符位置和文本描述。 使用方法: 在具体应用时可以用DOMDocument的Load方法来装载XML文档,用IXMLDOMNode的selectNodes(查询的结果有多个,得到存放搜索结果的链表)或selectSingleNode(查询的结果有一个,在有多个的情况下返回找到的第一个节点)方法进行查询,用createNode和appendChild方法来创建节点和追加节点,用IXMLDOMElement的setAttribute和getAttribute方法来设置和获得节点的属性。 四、程序实现下面通过一个具体的实例来说明在VC++中如何利用MSXML解析文档。 (1)源文档(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; //装载XML文档。 Hr = spXMLDOM->load(CComVariant(L"xmlfile.xml"),&bSuccess); CComBSTR bstrSS(L"Device"); CComPtr<IXMLDOMNode> spDevice; Hr = spXMLDOM->selectSingleNode(bstrSS,&spDevice); //搜索。 CComQIPtr<IXMLDOMElement> spDev; spDev = spDevice; //设置"Device"的"name"属性。 Hr = spDev ->setAttribute(CComBSTR(L"name"),CComVariant("")); CComPtr<IXMLDOMNode> spModelNode; //创建"Model"节点。 Hr = spXMLDOM->createNode(CComVariant(NODE_ELEMENT)ComBSTR "Model"),NULL,& spModelNode); CComPtr<IXMLDOMNode> spInsertedNode; Hr = spDevice->appendChild (spModelNode,&spInsertedNode); //添加新节点到"Device"节点下面。 CString strID="3"; //设置"Model"的文本。 hr=spInsertedNode->put_text(strID.AllocSysString()); / /保存文档。 hr=spXMLDOM->save(CComVariant("xmlfile.xml")); //结束对COM的使用。 CoUninitialize(); 因为篇幅的原因,上述代码的每步操作并未对返回的HRESULT类型进行判断,也未进行异常的捕获处理,在实际的编程中读者应根据返回的hr进行决断,以决定程序的流程,同时应进行异常的捕获处理。 3)修改后的文档如下 "> <Model>3</Model> </Device> MFC程序示例:
1、目标文档: <book id="bk101"> <author>lizlex</author> <title>XML Developer's Guide</title> </book> 2、步骤: (1)在StdAfx.h中引入动态链接库MSXML.DLL(C:windowssystem32msxml4.dll) #import <msxml4.dll>
(2)界面设计: 分别放入三个Text,用于输入数据,与显示文档内容用,并添加关联的成员变量 m_strId,m_strAuthor,m_strTitle;并添加确定按钮。
(3)产生文档的程序片断: void CXmlparseDlg::OnButtonGenerate() { UpdateData(); MSXML2::IXMLDOMDocumentPtr pDoc; MSXML2::IXMLDOMElementPtrxmlRoot ; //创建DOMDocument对象 HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); if(!SUCCEEDED(hr)) { MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser运行库!"); return ; }
//根节点的名称为Book //创建元素并添加到文档中 xmlRoot=pDoc->createElement((_bstr_t)"Book");
//设置属性 xmlRoot->setAttribute("id",(const char *)m_strId); pDoc->appendChild(xmlRoot); MSXML2::IXMLDOMElementPtr pNode; //添加“author”元素 pNode=pDoc->createElement((_bstr_t)"Author"); pNode->Puttext((_bstr_t)(const char *)m_strAuthor); xmlRoot->appendChild(pNode);
//添加“Title”元素 pNode=pDoc->createElement("Title"); pNode->Puttext((const char *)m_strTitle); xmlRoot->appendChild(pNode);
//保存到文件 //如果不存在就建立,存在就覆盖 pDoc->save("d:he.xml"); }
(4)读取XML文档的程序片断: void CXmlparseDlg::OnButtonLoad() { MSXML2::IXMLDOMDocumentPtr pDoc; HRESULT hr; hr=pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); if(FAILED(hr)) { MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser运行库!"); return ; }
//加载文件 pDoc->load("d:he.xml");
MSXML2::IXMLDOMNodePtrpNode;
//在树中查找名为Book的节点,"//"表示在任意一层查找 pNode=pDoc->selectSingleNode("//Book"); MSXML2::DOMNodeType nodeType;
//得到节点类型 pNode->get_nodeType(&nodeType);
//节点名称 CString strName;
strName=(char *)pNode->GetnodeName(); //节点属性,放在链表中 MSXML2::IXMLDOMNamedNodeMapPtr pAttrMap=NULL; MSXML2::IXMLDOMNodePtr pAttrItem; _variant_t variantValue; pNode->get_attributes(&pAttrMap);
long count; count=pAttrMap->get_length(&count);
pAttrMap->get_item(0,&pAttrItem); //取得节点的值 pAttrItem->get_nodeTypedValue(&variantValue); m_strId=(char *)(_bstr_t)variantValue; UpdateData(FALSE); }
在VC中应用MSXML DOM 的一些基本实现方法: 已知变量 MSXML2::IXMLDOMParseError*pObjError=NULL; 已知数据: **)创建新文档 a)添加子节点到父节点 b)创建节点
c)创建元素节点 d)创建文本子节点,并添加到父节点中
e)创建//Createaprocessinginstructionelement.
f)创建注释节点
g)元素节点属性值
h)节点属性值
i)节点 (2)根据节点得到节点名称
j)XML文件操作 BSTRbstr=NULL;
k)错误处理 BSTRbstr=NULL; pDoc->get_parseError(&pObjError); pObjError->get_reason(&bstr); AfxMessageBox(_T("FailedtoloadDOMfrombooks.xml.%Sn"),*bstr); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |