快捷搜索:

在 Windows Mobile 下使用MSXML

首先是头文件:

#include

初始化 COM 情况:

hr = CoInitializeEx(NULL, 0);

创建一个 XML DOM 工具:

IXMLDOMDocument *pDOM = NULL;

hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,

IID_IXMLDOMDocument, (LPVOID*)&pDOM);

然后便是加载XML的内容,加载有两种要领,从文件加载和从字符串加载:

// 从文件加载

VARIANT vt;

VARIANT_BOOL fSuccess;

vt.vt = VT_BSTR;

vt.bstrVal = SysAllocString(szPath);

hr = pDOM->load(vt, &fSuccess);

// 从字符串加载,第一个参数的类型是 BSTR,不过 LPWSTR 也不要紧

// 假如项目的预处置惩罚器没有设置 UNICODE 之类的器械,就用 char* 吧

LPWSTR xmlSource = TEXT(“”)

hr = pDOM->loadXML(xmlSource, &fSuccess);

获得 DOM 工具后,可以直接创建新的元素、节点;也可以从根节点开始遍历;也可以选择自己想要的节点直接进行处置惩罚。

选择根节点:

IXMLDOMElement* pRoot  = NULL;

hr = pDom->get_documentElement(&pRoot);

从根节点开始遍历必要用到 IXMLDOMNodeList 接口:

IXMLDOMNodeList* pNodeList = NULL;

hr = pRoot->get_childNodes(&pNodeList);

IXMLDOMNode*  pNode = NULL;

hr = pNodeList->nextNode(&pNode); // 留意这个返回值,你可以不管它,但不要用 hr != S_OK 判断

while( pNode != NULL )

{

// 干你想干的任何事,然后获得下一个节点

hr = pNodeList->nextNode(&pNode); /

}

从 IXMLDOMNodeList 中只能获得 IXMLDOMNode 接口,假如必要其它接口的操作,必要作点四肢举动。

1.接口查询,在你你确切知道这个节点的类型的时刻对照有用

IXMLDOMElement* pElement = NULL;

hr = pNode->QueryInterface(IID_IXMLDOMElement, (void **)&pElement);

2.得到接口的真实类型,当你必要根据节点类型作不合处置惩罚的时刻有用

DOMNodeType type;

Hr = pNode->get_nodeType(&type);

必要选择部分节点进行造访有两种措施:

HRESULT selectSingleNodes(BSTR queryString, IXMLDOMNode** resultNode);

HRESULT selectNodes(BSTR queryString, IXMLDOMNode** resultNode);

第一个用来选在单一节点,第二个用来选择多个节点。查询的语法在 XPath 中有具体先容。这两个措施对付 IXMLDOMDocument, IXMLDOMNode, IXMLDOMElement 都适用。着实只要知道 IXMLDOMNode 支持就可以了,其他两个接口都是它的派生接口。

比如要选择根节点下的所有 Contact 节点:

hr = pRoot->selectNodes(TEXT("./Contact"), &pNodeList);

其它常用的操作是删除元素、添加元素、设置和造访属性值:

删除元素可以应用:IXMLDOMNode::removeChild;

添加元素可以应用:IXMLDOMNode::appendChild;

设置属性可以应用:IXMLDOMElement::setAttribute;

造访属性可以应用:IXMLDOMElement::getAttribute;

创建元素、属性等可以应用 IXMLDOMDocument 的一系列 create 措施,比如创建元素的 createElement 等。此次最常常用到的两个是 createElement 和 createProcessingInstruction:

IXMLDOMProcessingInstruction* pInstruction = NULL;

IXMLDOMNode* pNewNode = NULL;

hr = pDOM->createProcessingInstruction( TEXT("xml"),

TEXT("version='1.0' encoding='UTF-8'"), &pInstruction);

_variant_t vt = pRoot; // 插到根节点的前面

pDom->insertBefore(pInstruction, vt, &pNewNode);

pInstruction->Release();

pNewNode->Release();

IXMLDOMElement* pElement = NULL;

hr = pDOM->createElement(TEXT(“ElementName”), &pElement);

可以给 pElement 添加子节点,设置属性,然后添加

hr = pRoot->appendChild(pElement, &pNewNode);

pElement->Release();

pNewNode->Release();

着末是 xml 文档的保存

_variant_t varString = TEXT("saved.xml");

hr = pDOM->save(varString);

别忘了开释资本:

pNodeList->Release();

pRoot->Release();

pDOM->Release();

您可能还会对下面的文章感兴趣: