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

时间:2009-11-30 22:37:25

标签: c++ c xml msxml

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

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

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

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

有没有人对如何做到这一点有任何其他想法?

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

谢谢, 保罗

1 个答案:

答案 0 :(得分:1)

最简单的方法是将加载函数传递给安全数组。 e.g。

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并将其传递给load。