2

ネットワーク ソケット経由で XML を受信して​​います。その XML を取得して DOM にロードし、さらに操作を実行する必要があります。MSXML では、UCS-2 または UTF-16 のいずれかの入力文字列が必要であり、文字列からロードするときにエンコーディング タイプの XML ヘッダーを完全に無視します。これは XML フラグメントのロードを許可するので、これはある程度理にかなっています。

この問題を処理するには、次の 2 つの方法が考えられます。

1) ファイルをディスクに書き出し、ファイル パス経由で MSXML に読み込みます。余分なディスク I/O があるため、この方法はあまり好ましいものではありません。

2) XML ヘッダーに到達してエンコーディングを手動で検出し、MultiByteToWideChar を呼び出して UTF-16 に変換し、検出されたエンコーディングに基づいてコード ページを指定します。このアプローチは問題なく機能しますが、エンコーディング検出を MSXML にプッシュしたいと思います。

これを達成する方法について他にアイデアはありますか?

私は他の XML パーサーを調べたことはありませんが、MSXML 以外の DOM パーサーがこれをどのように実現するかに興味があります。

ありがとう、ポール

4

1 に答える 1

1

最も簡単な方法は、load 関数にセーフ配列を渡すことです。例えば

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;

VariantInit(&v);
V_VT(&v) = VT_ARRAY | VT_UI1;
V_ARRAY(&v) = psa;
VARIANT_BOOL fSuccess;
pXMLDoc->load(v, &fSuccess);
if(fSuccess == VARIANT_TRUE)
{
    /* 何かをする */
}

明らかに、エラーチェックが行われたり、リソースが解放されたりすることはありません。

または、CreateStreamOnHGlobal を使用してデータに IStream を作成し、それをロードに渡します。

于 2009-11-30T22:55:06.083 に答える