基于 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")  // 确保链接 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:

  1. 右键项目 → 属性 → C/C++ → 常规 → 附加包含目录

    加入 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include

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

    加入:msxml6.lib

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

✅ 四、你接下来能做的事

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

✅ 五、推荐资料

  • 官方 MSDN 文档:MSXML 6.0 SDK

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

相关推荐
chilavert3186 小时前
技术演进中的开发沉思-304计算机原理:XML
xml·计算机原理
程序猿零零漆2 天前
Spring之旅 - 记录学习 Spring 框架的过程和经验(十一)基于XML方式、注解的声明式事务控制、Spring整合Web环境
xml·学习·spring
科雷软件测试2 天前
推荐几个常用的校验yaml、json、xml、md等多种文件格式的在线网站
xml·html·md·yaml
susu10830189112 天前
maven-3.9.12的conf配置settings.xml
xml·java·maven
odoo中国4 天前
如何在 Odoo 中从 XML 文件调用函数
xml·odoo·odoo开发·调用函数
阿凉07025 天前
新版本JLink安装目录中缺失JLinkDevices.xml添加方法
xml·嵌入式硬件
Knight_AL5 天前
从 QueryWrapper 到 XML:一次「报表 SQL」的重构实践
xml·sql·重构
智航GIS6 天前
9.5 XML 处理指南
xml·前端·python
像风一样的男人@6 天前
python --yolo混合文件xml和img整理
xml·python·yolo
飞舞花下12 天前
MAVEN私有仓库配置-Nexus私有仓库
xml·java·maven