当前位置: 首页 > news >正文

基于 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:

  1. 右键项目 → 属性 → C/C++ → 常规 → 附加包含目录
    加入 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include

  2. 链接器 → 输入 → 附加依赖项
    加入:msxml6.lib

  3. 确保系统安装了 MSXML6(大部分 Win10/11 系统默认包含)

✅ 四、你接下来能做的事

目的操作
✅ 读取 XML用上面示例即可
✅ 写入 XMLcreateElement + setAttribute + appendChild
✅ XPath 查询使用 selectNodesselectSingleNode
✅ 获取属性get_attributesgetNamedItem
✅ 中文支持控制台用 SetConsoleOutputCP(CP_UTF8),字符串处理时用 BSTR
✅ 做成封装类IXMLDOMDocumentPtr 封装为类:如 CXmlDocument

✅ 五、推荐资料

  • 官方 MSDN 文档:MSXML 6.0 SDK

  • 类似封装库参考:Yaodu 的 CXmlDocument、TinyXML、RapidXML

http://www.lqws.cn/news/96247.html

相关文章:

  • mac下通过anaconda安装Python
  • c语言内存函数
  • Java 中执行命令并使用指定配置文件的最佳实践
  • Oracle双平面适用场景讨论会议
  • 云服务器宕机或重启后数据会丢失吗?
  • 数据驱动在线教育平台优化:用数据帮你变成“教书匠+数据控”
  • Agentic Workflow是什么?Agentic Workflow会成为下一个AI风口吗?
  • Springboot中Controller接收参数的方式
  • 第7章 :面向对象
  • Spring Security
  • tryhackme——Abusing Windows Internals(进程注入)
  • Qwen3高效微调
  • 服务器被攻击了怎么办
  • 机器学习与深度学习08-随机森林02
  • 解决MyBatis参数绑定中参数名不一致导致的错误问题
  • 服务器租用:高防CDN和加速CDN的区别
  • Java基础之数组(附带Comparator)
  • 《TCP/IP 详解 卷1:协议》第5章:Internet协议
  • electron-vite_18桌面共享
  • 电脑硬盘分几个区好
  • Oracle、PostgreSQL 与 MySQL 数据库对比分析与实践指南
  • React知识点梳理
  • pip安装python第三方库报错
  • ‌CDGP|数据治理的低效性:企业AI落地的另一大挑战
  • LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 下
  • chromedriver 下载失败
  • 使用Redis的四个常见问题及其解决方案
  • backend 服务尝试连接 qdrant 容器,但失败了,返回 502 Bad Gateway 问题排查
  • LeetCode 139. 单词拆分(Word Break) - 动态规划深度解析
  • 堆叠弹窗 VS 队列弹窗之争