一、首先在程序适当的地方加入
#include <atlbase.h>
#import "msxml3.dll"
using namespace MSXML2;
二、装载XML文档
CoInitialize(NULL); // 初始化COM,初始化当前线程使用什么样的套间
//CComPtr<MSXML::IXMLDOMDocument> //通过智能指针创建解析器实例
CComPtr<IXMLDOMDocument> spXMLDOM; // DOM---文档对象模型
spXMLDOM.CoCreateInstance(_uuidof(DOMDocument));
// DOMDocument对象暴露了下面几个属性,允许用户在运行的时候改变解析器的行为
spXMLDOM->put_async(VARIANT_FALSE);
spXMLDOM->put_validateOnParse(VARIANT_FALSE);
spXMLDOM->put_resolveExternals(VARIANT_FALSE);
spXMLDOM->put_preserveWhiteSpace(VARIANT_TRUE);
spXMLDOM->load(xxxpath);
// 一些定义
CComPtr<IXMLDOMNodeList> spNODES = NULL;
CComPtr<IXMLDOMNodeList> spCHILDS = NULL;
CComPtr<IXMLDOMNode> spNode = NULL;
CComPtr<IXMLDOMNode> spChildNode = NULL;
三、遍历某类节点
_bstr_t bstrNodeName = "xxxx";
spNODES = spXMLDOM->getElementsByTagName(bstrNodeName); // 得到这类节点的集合
spNODES->reset(); // ??有必要??
// 方法一
long n = spNODES->Getlength();
for(long i=0; i<n; i++) 
...{
spNode = spNODES->nextNode();
// 一些处理,例如
CString aa = spNode->Gettext();
}

// 方法二
for (long j=0; j<spNODES->length; j++) 
...{
spNode = spNODES->Getitem(j);
// 一些处理,例如
CString aaa = spNode->text.copy();
}
四、创建、插入子节点
// 创建新节点
CComPtr<IXMLDOMNode> spNewNode;
spNewNode = spXMLDOM->createNode(CComVariant(NODE_ELEMENT),_bstr_t("newnode"),_bstr_t("xxx"));
CComQIPtr<IXMLDOMElement> spNewElement;
spNewElement = spNewNode; // 如果要向新创建的节点添加属性,就必须通过其作为“元素”的一面来访问它
spNewElement->setAttribute(_bstr_t("mm"), CComVariant("yy")); //设置属性
spNewNode->Puttext(_bstr_t("hello"));
// 插入新节点
spNode = spXMLDOM->selectSingleNode("dad/paragraph"); // 要写父节点的全路径!
spNode->appendChild(spNewNode);
// 保存
spXMLDOM->save("C:/xxx.xml");
五、读取子节点
// 类似的
CComPtr<IXMLDOMNodeList> spCHILDS = spNode->GetchildNodes();
// 即可
本文介绍如何使用C++及MSXML库进行XML文件的加载、节点遍历、子节点读取、创建与插入等操作。包括初始化COM、创建解析器实例、设置解析器行为、加载XML文档、遍历特定节点集合、创建并插入新节点等内容。
31万+





