完整教程:基于 COM 的 XML 解析技术(MSXML) 的总结

完整教程:基于 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

#import "msxml6.dll" raw_interfaces_only // 更现代的方式

✅ 二、典型 COM + MSXML 读取 XML 示例(含节点、属性)示例:读取 FaceConfig.xml

#include

#include

#include

#pragma comment(lib, "msxml6.lib") // 确保链接 MSXML6

void ReadXmlViaCOM() {

::CoInitialize(NULL); // 初始化 COM

IXMLDOMDocumentPtr pDoc;

HRESULT hr = pDoc.CreateInstance(__uuidof(DOMDocument60)); // 或 DOMDocument30

if (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

相关文章

沈浩晨,沈浩晨官网,沈浩晨个人资料及最新动态
365平台被黑

沈浩晨,沈浩晨官网,沈浩晨个人资料及最新动态

⌛ 07-08 👁️‍🗨️ 2681
Wido轻量化WiFi物联网节点控制器解决方案
365平台被黑

Wido轻量化WiFi物联网节点控制器解决方案

⌛ 09-26 👁️‍🗨️ 9683
个人经验:中九小锅倒装超详细教程方法(多图)
365bet365.com

个人经验:中九小锅倒装超详细教程方法(多图)

⌛ 12-13 👁️‍🗨️ 5474
判断客户价值,用好这3个数据分析模型就足够了!
365平台被黑

判断客户价值,用好这3个数据分析模型就足够了!

⌛ 12-19 👁️‍🗨️ 6957
电脑版微信如何锁定?两种方法轻松保护你的隐私!
365平台被黑

电脑版微信如何锁定?两种方法轻松保护你的隐私!

⌛ 09-22 👁️‍🗨️ 918
鬃狮蜥怎么喂?3 种食物搭配公式,新手也能喂出健康 “大蜥蜴”