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

基于 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.lryc.cn/news/2403390.html

相关文章:

  • 多分辨率 LCD 的 GUI 架构设计与实现
  • 2025年,百度智能云打响AI落地升维战
  • Seed1.5-VL登顶,国产闭源模型弯道超车丨多模态模型5月最新榜单揭晓
  • SON.stringify()和JSON.parse()之间的转换
  • 【学习笔记】构造函数+重载相关
  • JVM——打开JVM后门的钥匙:反射机制
  • 第3章——SSM整合
  • VTK 显示文字、图片及2D/3D图
  • 小白如何在cursor中使用mcp服务——以使用notion的api为例
  • 引领AI安全新时代 Accelerate 2025北亚巡展·北京站成功举办
  • 为什么说数列是特殊的函数
  • 解决uniapp开发app map组件最高层级 遮挡自定义解决底部tabbar方法
  • 96. 2017年蓝桥杯省赛 - Excel地址(困难)- 进制转换
  • PPT转图片拼贴工具 v1.0
  • 大模型在脑梗塞后遗症风险预测及治疗方案制定中的应用研究
  • Qwen2.5-VL - 模型结构
  • 【QT常用技术讲解】多线程执行后台命令行的两种方式(后台运行和返回打印信息)
  • 【行驶证识别成表格】批量OCR行驶证识别与Excel自动化处理系统,行驶证扫描件和照片图片识别后保存为Excel表格,基于QT和华为ocr识别的实现教程
  • Linux--进程的状态
  • (nice!!!)(LeetCode每日一题)2434. 使用机器人打印字典序最小的字符串(贪心+栈)
  • 008-libb64 你有多理解base64?-C++开源库108杰
  • 电子电路基础2(杂乱)
  • LazyOwn RedTeam/APT 框架是第一个具有人工智能驱动的 CC 的 RedTeam 框架
  • 电脑的ip地址会自动变怎么办?原因解析和解决方法
  • PDF 转 HTML5 —— HTML5 填充图形不支持 Even-Odd 奇偶规则?(第一部分)
  • C++.OpenGL (5/64)变换(Transformation)
  • 优化电脑的磁盘和驱动器提高电脑性能和延长硬盘寿命?
  • 【八股消消乐】MySQL参数优化大汇总
  • JavaSec-SPEL - 表达式注入
  • 在 Caliper 中执行不同合约的方法