代码之家  ›  专栏  ›  技术社区  ›  Pau

用字节数组将XML加载到C++ MSXML中

  •  2
  • Pau  · 技术社区  · 15 年前

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

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

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

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

    有人对如何实现这一目标有其他想法吗?

    我还没有研究过其他的XML解析器,但对非MSXML DOM解析器如何完成这一点很感兴趣。

    谢谢, 保罗

    1 回复  |  直到 15 年前
        1
  •  1
  •   tyranid    15 年前

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

    const char* xml = "<root/>";
    
    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));
    VARIANT v;
    
    VariantInit(&v);
    V_VT(&v) = VT_ARRAY | VT_UI1;
    V_ARRAY(&v) = psa;
    VARIANT_BOOL fSuccess;
    pXMLDoc->load(v, &fSuccess);
    if(fSuccess == VARIANT_TRUE)
    {
        /* Do Something */
    }
    

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

    或者使用CreateStreamOnHglobal在数据上创建IStream并将其传递到加载中。