MSXML使用教程
VC++中利用MSXML解析XML文档
一、XML 简介
XML(Xtensible Markup Language,即扩展标记语言)的发展起源于1996年。当时,出版界巨头和Web业内人士经过共同讨论,提出了创建SGML(Standard Generalized Markup Language,即标准通用标识语言)子集(HML)的建议。该子集专用于Web,具有可扩展(或可扩充)性,并且能利用结构化标记语言的所有高级功 能,但摒弃了SGML的复杂性。XML规范的第一份草稿于1996年11月发布后不久,1997年1月首个XML解析器就面世了。随后,便出现了XML的 应用以及新的规范和解析器。
HTML(Hypertext Markup Language)语言是大家所熟悉的开发网页的一种标记语言,但它不是一种编程语言,它的主要标记是针对文档内容本身结构的描述,因机器本身是不能够解 析它的内容的。XML语言是SGML语言的子集,它保留了SGML主要的使用功能,同时大大减小了SGML的复杂性。它不仅能表示文档的内容,而且可以表 示文档的结构,这样在能够被人类理解的同时,也能够被机器所理解。虽然HTML是SGML的一个应用,XML是SGML的一个子集,但是XML绝不是在 HTML上添加某些元素而形成的,它们之间是有很大区别的。最大的区别就是XML允许使用者为某种特殊目的而定义自已的元素。除此之外,另一个最主要的区 别就是XML致力解决的问题,正是在使用HTML时所遇到的一些特殊问题。
XML要求遵循一定的严格标准,其分析程序比HTML浏览器对语法和结构的要求更加严格。XML文档每次分析的结果都一致,而HTML在不同的浏览器 中可能会作出不同的分析和显示。同时,XML标准是对数据的处理应用,而不只是针对Web页的,它还可涉及到数据库电子商务系统,以及任何显示系统的高级 应用。开发者可根据特定的工业需求,利用XML创建自定义的数据结构。这些数据结构和数据库可以在许多设备上查看,而不需要使用自定义的接口在不同的显示 设备上查看相同的数据。
XML主要有三个要素:文档类型声明(DTD:Document Type Declaration)或XML Schema(XML大纲)、可扩展样式语言(XSL:eXtensible Stylesheet Language)和可扩展链接语言(XLink:eXtensible Link Language)。DTD和XML大纲规定了XML文件的逻辑结构,定义了XML文件中的元素、元素的属性以及元素与元素属性之间的关系; Namespace(名域)实现了统一的XML文档数据表示以及数据的相互集成;XSL是用于规定XML文档呈现样式的语言,它使得数据与其表现形式相互 独立,比如XSL能使Web浏览器改变文档的表示法,如数据显示顺序的变化,不需要再与服务器进行通讯。通过改变样式表,同一个文档可以显示得更大,或者 经过折叠只显示外面的一层,或者可以变为打印的格式。而XLink 将进一步扩展目前Web上已有的简单链接。
二、文档对象模型(DOM)
在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公布的一种跨平台、与语言无关的接口规范,DOM提供了在不同环境和应用中的标准程序接口,可以用任何语言实现。
DOM采用对象模型和一系列的接口来描述XML文档的内容和结构,即利用对象把文档模型化。这种对象模型实现的基本功能包括:
描述文档表示和操作的接口;
接口的行为和属性;
接口之间的关系以及互操作。
DOM可对结构化的XML文档进行解析,文档中的指令、元素、实体、属性等所有内容个体都用对象模型表示,整个文档被看成是一个有结构的信息树,而不是简单的文本流,生成的对象模型就是树的节点,对象同时包含了方法和属性。因此,对文档的所有操作都是在对象树上的进行。在DOM中,树中的一切都是对象,不管是根节点还是实体的属性。
在DOM中主要有以下三个对象:
· 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;
// 装载XML文档。
Hr = spXMLDOM->load(CComVariant(L”xmlfile.xml”),&bSuccess);
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;
// 创建“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) 修改后的XML文档如下
<?xml version=”1.0″ encoding=”GB2312″?>
<Device id=”10041″ name=”测试设备“>
<Type>13</Type>
<TypeName>保护</TypeName>
<Model>3</Model>
</Device>
五、结束语
因为XML文档有着比HTML更严格的语法要求,所以使用和编写一个XML解析器要比编写一个HTML解析器要容易得多。同时因为XML文档不仅可以 标记文档的显示属性,更重要的是它标记了文档的结构和包含信息的特征,所以我们可以方便地通过XML解析器来获取特定节点的信息并加以显示或修改,方便了 用户对XML文档的操作和维护。同时我们需要注意的是,XML是一种开放的结构体系,并不依赖于任何一家公司,所以开发基于XML的应用必然会得到绝大多数软件开发平台的支持。
MFC程序示例:
1、目标文档:
<book id=”bk101″>
<author>lizlex</author>
<title>XML Developer\’s Guide</title>
</book>
2、步骤:
(1)在StdAfx.h中引入动态链接库 MSXML.DLL(C:\windows\system32\msxml4.dll)
#import <msxml4.dll>
(2)界面设计:
分别放入三个Text,用于输入数据,与显示文档内容用,并添加关联的成员变量
m_strId, m_strAuthor, m_strTitle;并添加确定按钮。
(3)产生文档的程序片断:
void CXmlparseDlg::OnButtonGenerate()
{
UpdateData();
MSXML2::IXMLDOMDocumentPtr pDoc;
MSXML2::IXMLDOMElementPtr xmlRoot ;
//创建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::IXMLDOMNodePtr pNode;
//在树中查找名为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);
}
一个封装类
class XMLProc {
public:
IXMLDOMDocumentPtr createFile;
IXMLDOMDocumentPtr readFile;
IXMLDOMElementPtr createRoot;
IXMLDOMElementPtr readRoot;
IXMLDOMProcessingInstructionPtr pPI;
HRESULT hr;
public:
XMLProc();
~XMLProc(){}
IXMLDOMDocumentPtr Create(char* rootTag);
BOOL NewElement(char* tag, char* text, IXMLDOMElement** newNode);
BOOL NewElement(char* tag, IXMLDOMElement** newNode);
BOOL AddChild(IXMLDOMElement* childElem, IXMLDOMElement* parentElem);
BOOL SaveCreateFile(char* dfile);
IXMLDOMDocumentPtr Read(char* sfile);
BOOL SelectElement(char* tag, IXMLDOMElement** node);
BOOL GetText(IXMLDOMElement* elem, char* text, int* tlen);
BOOL SaveReadFile(char* dfile);
BOOL ChangeText(IXMLDOMElement* elem, char* text);
BOOL GetParent(IXMLDOMElement* childElem, IXMLDOMElement** parentElem);
BOOL GetChild(IXMLDOMElement** childElem, IXMLDOMElement* parentElem);
BOOL RemoveChild(IXMLDOMElement* childElem, IXMLDOMElement* parentElem);
BOOL SetAttribute(IXMLDOMElement* node, char* attr, char* value);
IXMLDOMDocumentPtr GetCreateFile();
IXMLDOMDocumentPtr GetReadFile();
IXMLDOMElement* GetCreateRoot();
IXMLDOMElement* GetReadRoot();
void Fail();
void Exit();
};
/***************************************************************/
/***************************************************************/
XMLProc::XMLProc()
{
//CoInitialize(NULL);
createFile = NULL;
readFile = NULL;
createRoot = NULL;
readRoot = NULL;
pPI = NULL;
}
IXMLDOMDocumentPtr XMLProc::Create(char* rootTag)
{
if (rootTag == NULL)
return 0;
hr = createFile.CreateInstance(__uuidof(DOMDocument));
FAIL(hr);
hr = createFile->createProcessingInstruction( _bstr_t(_T(“xml”)), _bstr_t(_T(“version=\”1.0\” encoding=\”GBK\””)), &pPI );
//hr = createFile->createProcessingInstruction( _bstr_t(_T(“xml”)), _bstr_t(_T(“version=\”1.0\””)), &pPI );
FAIL(hr);
hr = createFile->appendChild(pPI, NULL);
FAIL(hr);
hr = createFile->createElement(_bstr_t(rootTag), &createRoot);
FAIL(hr);
hr = createFile->appendChild(createRoot, NULL);
FAIL(hr);
return createFile;
}
IXMLDOMDocumentPtr XMLProc::Read(char *sfile)
{
VARIANT_BOOL dl;
hr = readFile.CreateInstance(__uuidof(DOMDocument));
FAIL(hr);
hr = readFile->load(_variant_t(sfile), &dl);
FAIL(hr);
hr = readFile->get_documentElement(&readRoot);
FAIL(hr);
return readFile;
}
BOOL XMLProc::NewElement(char* tag, char* text, IXMLDOMElement** newNode)
{
if (createFile == NULL || tag == NULL || text == NULL){
return FALSE;
}
hr = createFile->createElement(_bstr_t(tag), newNode);
if (hr != S_OK)
return FALSE;
(*newNode)->put_text(_bstr_t(text));
return TRUE;
}
BOOL XMLProc::NewElement(char* tag, IXMLDOMElement** newNode)
{
if (createFile == NULL || tag == NULL){
return FALSE;
}
hr = createFile->createElement(_bstr_t(tag), newNode);
if (hr != S_OK)
return FALSE;
return TRUE;
}
BOOL XMLProc::SelectElement(char *tag, IXMLDOMElement** node)
{
char usetag[MAXTAGLEN + 2] = “//”;
if (readFile == NULL || tag == NULL || strlen(tag) >= MAXTAGLEN)
return FALSE;
strcat(usetag, tag);
hr = readFile->selectSingleNode(_bstr_t(usetag), (IXMLDOMNode**)node);
if (hr != S_OK)
return FALSE;
return TRUE;
}
BOOL XMLProc::GetText(IXMLDOMElement *elem, char* text, int* tlen)
{
BSTR bst;
_bstr_t bt;
if (elem == NULL || text == NULL)
return FALSE;
hr = elem->get_text(&bst);
if (hr != S_OK)
return FALSE;
else {
bt = bst;
*tlen = (int)strlen((char*)bt) > *tlen ? *tlen : (int)strlen((char*)bt);
strncpy(text, (char*)bt, *tlen);
text[*tlen] = 0;
return TRUE;
}
}
BOOL XMLProc::ChangeText(IXMLDOMElement *elem, char* text)
{
if (elem == NULL)
return FALSE;
hr = elem->put_text(_bstr_t(text));
if (hr != S_OK)
return FALSE;
else {
return TRUE;
}
}
BOOL XMLProc::AddChild(IXMLDOMElement* childElem, IXMLDOMElement* parentElem)
{
if (parentElem == NULL || childElem == NULL)
return FALSE;
hr = parentElem->appendChild((IXMLDOMNode*)childElem, NULL);
if (hr != S_OK)
return FALSE;
else
return TRUE;
}
BOOL XMLProc::GetParent(IXMLDOMElement* childElem, IXMLDOMElement** parentElem)
{
if (childElem == NULL)
return FALSE;
hr = childElem->get_parentNode((IXMLDOMNode**)parentElem);
if (hr != S_OK)
return FALSE;
else
return TRUE;
}
BOOL XMLProc::GetChild(IXMLDOMElement** childElem, IXMLDOMElement* parentElem)
{
if (parentElem == NULL)
return FALSE;
hr = parentElem->get_firstChild((IXMLDOMNode**)childElem);
if (hr != S_OK)
return FALSE;
else
return TRUE;
}
BOOL XMLProc::SetAttribute(IXMLDOMElement* node, char* attr, char* value)
{
if (node == NULL){
return FALSE;
}
hr = node->setAttribute(_bstr_t(attr), _variant_t(value));
if (hr != S_OK)
return FALSE;
else
return TRUE;
}
BOOL XMLProc::RemoveChild(IXMLDOMElement* childElem, IXMLDOMElement* parentElem)
{
if (parentElem == NULL || childElem == NULL)
return FALSE;
hr = parentElem->removeChild((IXMLDOMNode*)childElem, NULL);
if (hr != S_OK)
return FALSE;
else
return TRUE;
}
BOOL XMLProc::SaveCreateFile(char* dfile)
{
if (createFile == NULL || dfile == NULL)
return FALSE;
hr = createFile->save(_variant_t(dfile));
if (hr != S_OK){
return FALSE;
}
else
return TRUE;
}
BOOL XMLProc::SaveReadFile(char* dfile)
{
if (readFile == NULL || dfile == NULL)
return FALSE;
hr = readFile->save(_variant_t(dfile));
if (hr != S_OK)
return FALSE;
else
return TRUE;
}
IXMLDOMDocumentPtr XMLProc::GetCreateFile()
{
return createFile;
}
IXMLDOMDocumentPtr XMLProc::GetReadFile()
{
return readFile;
}
IXMLDOMElement* XMLProc::GetCreateRoot()
{
return createRoot;
}
IXMLDOMElement* XMLProc::GetReadRoot()
{
return readRoot;
}
void XMLProc::Fail()
{
if (readRoot)
readRoot.Release();
if (readFile)
readFile.Release();
if (createRoot)
createRoot.Release();
if (pPI)
pPI.Release();
if (createFile)
createFile.Release();
}
void XMLProc::Exit()
{
Fail();
//CoUninitialize();
}
另一篇: 在VC中应用MSXML DOM 的一些基本实现方法
已知变量
MSXML2::IXMLDOMDocument *pDoc;
MSXML2::IXMLDOMNode *pChild, *pParent;
MSXML2::IXMLDOMNode *pNod;
MSXML2::IXMLDOMElement *pEle;
初始化指针:
MSXML2::IXMLDOMDocument *pDocument=NULL;
MSXML2::IXMLDOMNodeList *pNodeList=NULL;
MSXML2::IXMLDOMNamedNodeMap *pNodeMap=NULL;
MSXML2::IXMLDOMNode *pNode=NULL
MSXML2::IXMLDOMText *pText=NULL;
MSXML2::IXMLDOMElement *pElement=NULL;
MSXML2::IXMLDOMProcessingInstruction *pProcessingInstruction=NULL;
MSXML2::IXMLDOMComment *pComment=NULL;
MSXML2::IXMLDOMParseError *pObjError = NULL;
已知数据:
BSTR bstrText, bstrName;
int type;
**)创建新文档
// hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER,
// IID_IXMLDOMDocument,(void**)&m_pXMLDoc);
HRESULT hr=CoCreateInstance(__uuidof(MSXML2::DOMDocument40),NULL,CLSCTX_INPROC_SERVER,
__uuidof(MSXML2::IXMLDOMDocument),(void**)&m_pXMLDoc);
hr = pDocument->put_async(VARIANT_FALSE);
hr = pDocument->put_validateOnParse(VARIANT_FALSE);
hr = pDocument->put_resolveExternals(VARIANT_FALSE);
a)添加子节点到父节点
pParent->appendChild(pChild, &pNode)
b)创建节点
VARIANT vtype;
vtype.vt = VT_I4;
V_I4(&vtype) = (int)type;
pDoc->createNode(vtype, bstrName, NULL, &pNode);
c)创建元素节点
pDoc->createElement(bstrName,pElement);
(pElement)->put_text(bstrText);
d)创建文本子节点,并添加到父节点中
pDoc->createTextNode(bstrText,&pText);
pParent->appendChild(pText,& pNode)
e)创建// Create a processing instruction element.
BSTR bstrTarget = SysAllocString(L”xml”);
BSTR bstrData = SysAllocString(L”version=\’1.0\'”);
pDoc ->createProcessingInstruction(bstrTarget, bstrData, &pProcessingInstruction);
SysFreeString(bstrTarget);
SysFreeString(bstrData);
f)创建注释节点
pDoc->createComment(bstrText, &pComment);
g)元素节点属性值
得到属性值
VARIANT v;
pEle->getAttribute(bstrName,&v);
CString str = v.bstrVal;
设置属性值
CComVariant v(str);
pEle->setAttribute(bstrName, v);
h)节点属性值
VARIANT v;
CString str;
long mCount;
得到节点属性集
hr=pNod->get_attributes(&pNodeMap);
hr=pNodeMap->get_length(&mCount);
得到节点属性
hr=pNodeMap->getNamedItem(bstrName,&pNode);
pNodeMap->get_item(i,&pNode);
得到节点属性值
hr=pNode->get_nodevalue(&v);
str =v.bstrVal;
删除节点属性
MSXML2::IXMLDOMNode *moldNode;
mNodeMape->removeNamedItem(bstrName,&moldNode);
if (moldNode!=NULL) moldNode->Release();
i)节点
(1)得到节点、节点集
根据节点名称
pDoc->getElementsByTagName(bstrName,&pNodeList);
pNodeList->get_item(0,&pNode);
得到子节点集
hr=pNod->get_childNodes(&mNodeList);
long mCount;
MSXML2::IXMLDOMNode *pNodeSub;
mNodeList->get_length(&mCount);
hr=pNode->get_firstChild(&pNodeSub);
删除子节点(包含删除节点属性、子节点、当前节点)
删除当前子节点
pNodeList->get_item(i,&pNode);
pNod->removeChild(pNode,&moldNode);
moldNode->Release();
(2)根据节点得到节点名称
pNod->get_nodeName(&bstrName);
(3)根据节点得到节点值
VARIANT v;
hr=pNod->get_nodevalue(&v);
j)XML文件操作
加载
VARIANT_BOOL status;
VARIANT vFileName;
(1)
pDoc->loadXML(bstrName,&status);
(2)
V_BSTR(&vFileName) = strFileName.AllocSysString();
V_VT(&vFileName) = VT_BSTR;
vResult = pDoc->load(vFileName,&status);
保存
BSTR pBFName = mFileName.AllocSysString();
CComVariant v(pBFName);
hr=pDoc->save(v);
BSTR bstr = NULL;
pDoc->get_xml(&bstr);
k)错误处理
BSTR bstr = NULL;
pDoc->get_parseError(&pObjError);
pObjError->get_reason(&bstr);
AfxMessageBox(_T(“Failed to load DOM from books.xml. %S\n”),*bstr);
=======================88888888888==============
另一篇:XML解析:
概述:DOM解析将会把一个完整的XML文档读进来,生成一个结构树。这样会要把XML文档全部都加载到内在中。所以解析起来的速度会要慢一些。
1、如何加载xml文件:
//创建DOM,加载XML文档
MSXML::IXMLDOMDocumentPtr pCommandDoc;
pCommandDoc.CreateInstance(__uuidof(MSXML::DOMDocument));
pCommandDoc->put_async(VARIANT_FALSE);
pCommandDoc->put_validateOnParse(VARIANT_FALSE);
pCommandDoc->put_resolveExternals(VARIANT_FALSE);
pCommandDoc->put_preserveWhiteSpace(VARIANT_TRUE);
pCommandDoc->load(file.GetBuffer(0));
2、在XML文档中查找指定的结点:
//找到
MSXML::IXMLDOMNodePtr pRootNode=pCommandDoc->selectSingleNode(“root/record”);
if (pRootNode==NULL)
{
return ;
}
3、得到XML文档中,结点的属性
CString strTemp;
MSXML::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
pRootNode->get_attributes(&pAttrs);
if (pAttrs==NULL)
{
return;
}
MSXML::IXMLDOMNodePtr pRequestTypeAttr=pAttrs->getQualifiedItem(“name”,””);
_bstr_t strRequestType=pRequestTypeAttr->Gettext();
strTemp=strRequestType.operator char *();
4、得到结点的内容
_bstr_t strVisiPort=pNode->Gettext();
5、设置结点的内容
HRESULT hr=pNode->put_text(_bstr_t(m_strGatewayPassword));