【问题标题】:Load XML into C++ MSXML from byte array从字节数组将 XML 加载到 C++ MSXML
【发布时间】:2010-12-21 19:54:29
【问题描述】:

我正在通过网络套接字接收 XML。我需要获取该 XML 并将其加载到 DOM 中以执行进一步的操作。 MSXML 需要 UCS-2 或 UTF-16 格式的输入字符串,并且在从字符串加载时完全忽略具有编码类型的 XML 标头。它允许加载 XML 片段,所以这是有道理的。

我看到了两种可能的方法来处理这个问题:

1) 将文件写入磁盘并通过文件路径将其加载到 MSXML。额外的磁盘 I/O 使这种方法远非首选。

2) 峰值到 XML 标头手动检测编码,然后调用 MultiByteToWideChar 转换为 UTF-16 并根据检测到的编码指定代码页。这种方法工作正常,但我想将编码检测推送到 MSXML 上。

有没有人对如何实现这一点有任何其他想法?

我没有看过其他 XML 解析器,但会对非 MSXML DOM 解析器如何实现这一点感兴趣。

谢谢, 保罗

【问题讨论】:

    标签: c++ c xml msxml


    【解决方案1】:

    最简单的方法是将加载函数传递给一个安全数组。例如

    const char* xml = "";
    
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = strlen(xml);
    
    SAFEARRAY* psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
    memcpy(psa->pvData, xml, strlen(xml));
    变体 v;
    
    变量初始化(&v);
    V_VT(&v) = VT_ARRAY | VT_UI1;
    V_ARRAY(&v) = psa;
    VARIANT_BOOL f成功;
    pXMLDoc->load(v, &fSuccess);
    如果(fSuccess == VARIANT_TRUE)
    {
        /* 做一点事 */
    }
    

    显然没有进行错误检查或释放资源。

    或者使用 CreateStreamOnHGlobal 在数据上创建一个 IStream 并将其传递给加载。

    【讨论】:

      猜你喜欢
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      • 2017-12-08
      相关资源
      最近更新 更多