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

相关推荐
武子康1 小时前
Java-39 深入浅出 Spring - AOP切面增强 核心概念 通知类型 XML+注解方式 附代码
xml·java·大数据·开发语言·后端·spring
在代码的海洋中寻找亚特兰蒂斯2 天前
AJAX对于XML和JSON的处理
xml·ajax·json
BinField3 天前
ToolsSet之:XML工具
xml·windows·microsoft
SEO-狼术4 天前
Connect Directly to Oracle XML Data
xml·数据库·oracle
YSoup4 天前
2025年目前最新版本Android Studio自定义xml预览的屏幕分辨率
android·xml·android studio
abcnull5 天前
mybatis的mapper对应的xml写法
xml·sql·spring·mybatis·mapper
Blue桃之夭夭5 天前
HTML、XML、JSON 是什么?有什么区别?又是做什么的?
xml·html·json
小于村5 天前
pom.xml 文件中配置你项目中的外部 jar 包打包方式
xml·java·jar
扶风呀5 天前
pom.xml中标签详解_
xml