一、首先在程序适当的地方加入
#include
<
atlbase.h
>
#import " msxml3.dll "
using namespace MSXML2;
#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;
// 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();
}
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 < 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();
// 即可
CComPtr < IXMLDOMNodeList > spCHILDS = spNode -> GetchildNodes();
// 即可