2

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

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

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

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

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

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

谢谢,保罗

4

1 回答 1

1

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

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));
变体 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 并将其传递给加载。

于 2009-11-30T22:55:06.083 回答