在Windows平台开发C++程序时,MSXML是系统自带的XML处理组件。借助IXMLDOMDocument接口,我们可以方便地加载XML字符串或文件,并对其进行节点查询与数据提取。下面介绍具体的使用方法。

环境准备与COM初始化
MSXML基于COM技术,因此在使用前必须初始化COM库,并在结束后释放。通常包含msxml6.h并链接msxml6.lib。
#include <windows.h>
#include <msxml6.h>
#include <comutil.h>
#pragma comment(lib, "msxml6.lib")
#pragma comment(lib, "comsuppw.lib")
int main() {
// 初始化COM环境
CoInitialize(NULL);
// 创建IXMLDOMDocument实例
IXMLDOMDocument* pDoc = NULL;
HRESULT hr = CoCreateInstance(CLSID_DOMDocument60, NULL,
CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void**)&pDoc);
if (SUCCEEDED(hr) && pDoc) {
// 后续解析操作
pDoc->Release();
}
// 释放COM
CoUninitialize();
return 0;
}
加载XML文档
可以通过load方法加载本地文件,或通过loadXML方法直接解析XML字符串。需要设置async属性为false以同步方式加载。
// 假设pDoc已创建成功
VARIANT_BOOL isAsync = VARIANT_FALSE;
pDoc->put_async(isAsync);
// 从字符串加载
BSTR xmlStr = SysAllocString(L"<root><item id='1'>hello</item></root>");
VARIANT_BOOL isLoaded = VARIANT_FALSE;
pDoc->loadXML(xmlStr, &isLoaded);
SysFreeString(xmlStr);
if (isLoaded == VARIANT_TRUE) {
// 加载成功
}
查询节点与读取数据
使用selectSingleNode获取单个节点,selectNodes获取节点集合。通过IXMLDOMElement读取属性和文本。
IXMLDOMNode* pNode = NULL;
BSTR query = SysAllocString(L"//item");
pDoc->selectSingleNode(query, &pNode);
SysFreeString(query);
if (pNode) {
// 读取文本
BSTR text = NULL;
pNode->get_text(&text);
// text即为节点文本,用完需SysFreeString释放
// 读取属性id
IXMLDOMElement* pElem = NULL;
if (SUCCEEDED(pNode->QueryInterface(IID_IXMLDOMElement, (void**)&pElem))) {
BSTR attrName = SysAllocString(L"id");
VARIANT var;
pElem->getAttribute(attrName, &var);
SysFreeString(attrName);
pElem->Release();
}
pNode->Release();
}
遍历节点集合
对于selectNodes返回的IXMLDOMNodeList,可通过nextNode依次遍历。
IXMLDOMNodeList* pList = NULL;
BSTR q2 = SysAllocString(L"//item");
pDoc->selectNodes(q2, &pList);
SysFreeString(q2);
if (pList) {
IXMLDOMNode* pItem = NULL;
while (S_OK == pList->nextNode(&pItem) && pItem) {
BSTR t = NULL;
pItem->get_text(&t);
// 处理t
SysFreeString(t);
pItem->Release();
pItem = NULL;
}
pList->Release();
}
注意事项
- 所有BSTR字符串都必须使用SysAllocString分配,并用SysFreeString释放。
- 每个COM接口指针在使用完毕后调用Release减少引用计数。
- 若XML包含命名空间,查询语句需使用前缀映射,否则无法匹配节点。
通过上述步骤,我们便能在C++中利用MSXML的IXMLDOMDocument完成基本的XML解析任务。实际项目中建议封装常用操作为辅助函数,以降低重复代码并避免资源泄漏。
C++MSXMLIXMLDOMDocumentXML解析COM编程修改时间:2026-07-25 08:39:22