基于 COM 的 XML 解析技术(MSXML) 的总结
✅ 一、COM 与 MSXML 简要说明
🔷 什么是 COM?
COM(Component Object Model)是一种 Windows 平台下的组件技术,可以实现在不重新编译代码的前提下复用组件。
特点:
-
用 接口调用方式 解耦依赖;
-
支持 动态加载库(
.dll
、.ocx
); -
MSXML 就是基于 COM 提供的 XML 解析组件。
🔷 什么是 MSXML?
MSXML(Microsoft XML Core Services)是微软提供的 COM 组件,用于 读取、操作和创建 XML 文档,通过 COM 接口如 IXMLDOMDocument
, IXMLDOMNode
进行操作。
MSXML 常用版本:
-
MSXML3(最常见)
-
MSXML6(更安全,推荐)
对应头文件和库:
#include <msxml2.h>
#import "msxml6.dll" raw_interfaces_only // 更现代的方式
✅ 二、典型 COM + MSXML 读取 XML 示例(含节点、属性)
示例:读取 FaceConfig.xml
#include <iostream>
#include <comdef.h>
#include <msxml2.h>#pragma comment(lib, "msxml6.lib") // 确保链接 MSXML6void ReadXmlViaCOM() {::CoInitialize(NULL); // 初始化 COMIXMLDOMDocumentPtr pDoc;HRESULT hr = pDoc.CreateInstance(__uuidof(DOMDocument60)); // 或 DOMDocument30if (FAILED(hr)) {std::cerr << "创建 XML Document 实例失败\n";return;}VARIANT_BOOL success = VARIANT_FALSE;pDoc->load(_variant_t(L"FaceConfig.xml"), &success);if (!success) {std::cerr << "加载 XML 文件失败\n";return;}IXMLDOMNodePtr root;pDoc->selectSingleNode(L"/faceconfig", &root);if (root) {IXMLDOMNamedNodeMapPtr attrs;root->get_attributes(&attrs);long attrLen = 0;attrs->get_length(&attrLen);for (long i = 0; i < attrLen; ++i) {IXMLDOMNodePtr attrNode;attrs->get_item(i, &attrNode);BSTR name, value;attrNode->get_nodeName(&name);attrNode->get_text(&value);std::wcout << name << L" = " << value << std::endl;SysFreeString(name);SysFreeString(value);}IXMLDOMNodeListPtr faceList;root->selectNodes(L"face", &faceList);long count = 0;faceList->get_length(&count);for (long i = 0; i < count; ++i) {IXMLDOMNodePtr faceNode;faceList->get_item(i, &faceNode);IXMLDOMNamedNodeMapPtr faceAttrs;faceNode->get_attributes(&faceAttrs);BSTR idVal = nullptr, tipVal = nullptr, fileVal = nullptr;faceAttrs->getNamedItem(L"id")->get_text(&idVal);faceAttrs->getNamedItem(L"tip")->get_text(&tipVal);faceAttrs->getNamedItem(L"file")->get_text(&fileVal);std::wcout << L"[face] id=" << idVal << L", tip=" << tipVal << L", file=" << fileVal << std::endl;SysFreeString(idVal);SysFreeString(tipVal);SysFreeString(fileVal);}}::CoUninitialize();
}
✅ 三、开发环境设置建议
✅ 如果你用的是 Visual Studio:
-
右键项目 → 属性 → C/C++ → 常规 → 附加包含目录
加入C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include
-
链接器 → 输入 → 附加依赖项
加入:msxml6.lib
-
确保系统安装了 MSXML6(大部分 Win10/11 系统默认包含)
✅ 四、你接下来能做的事
目的 | 操作 |
---|---|
✅ 读取 XML | 用上面示例即可 |
✅ 写入 XML | 用 createElement + setAttribute + appendChild |
✅ XPath 查询 | 使用 selectNodes 、selectSingleNode |
✅ 获取属性 | 用 get_attributes → getNamedItem |
✅ 中文支持 | 控制台用 SetConsoleOutputCP(CP_UTF8) ,字符串处理时用 BSTR |
✅ 做成封装类 | 用 IXMLDOMDocumentPtr 封装为类:如 CXmlDocument |
✅ 五、推荐资料
-
官方 MSDN 文档:MSXML 6.0 SDK
-
类似封装库参考:Yaodu 的
CXmlDocument
、TinyXML、RapidXML