2

私はC++でMSXMLの上にラッパーを書きました。ロード方法は以下のようになります。コードの問題は、整形式のxmlをロードできない場合があることです。

xmlを文字列として渡す前に、xmlnsの文字列検索を実行し、出現するすべてのxmlnsをxmlns:dnsに置き換えます。以下のコードでは、bom文字を削除しています。次に、MSXMLloadXMLメソッドを使用してロードしようとします。ロードが成功した場合、コードに示されているように名前空間を設定します。

 Class XmlDocument{

        MSXML2::IXMLDOMDocument2Ptr spXMLDOM;
         ....
    }

//XmlDocumentメソッド

void XmlDocument::Initialize()
    {

    CoInitialize(NULL);
    HRESULT hr = spXMLDOM.CreateInstance(__uuidof(MSXML2::DOMDocument60));
    if ( FAILED(hr) ) 
    {

        throw "Unable to create MSXML:: DOMDocument object";
    }

}

bool XmlDocument::LoadXml(const char* xmltext)
    {

        if(spXMLDOM != NULL)
        {

            char BOM[3] = {0xEF,0xBB,0xBF};
            //detect unicode BOM character
            if(strncmp(xmltext,BOM,sizeof(BOM)) == 0)
            {
                xmltext += 3;
            }

            VARIANT_BOOL bSuccess = spXMLDOM->loadXML(A2BSTR(xmltext));
            if ( bSuccess == VARIANT_TRUE) 
            {
                spXMLDOM->setProperty("SelectionNamespaces","xmlns:dns=\"http://www.w3.org/2005/Atom\"");

                return true;
            }
        }
        return false;

    }

デバッグしようとしましたが、loadXML()が整形式のxmlでさえロードできないことがある理由を理解できませんでした。コードで何が間違っているのですか。どんな助けでも大歓迎です。

ありがとうJeeZ

4

3 に答える 3

3

この特定の問題については、loadXMLに渡される文字列がUTF-16でエンコードされたBSTRである必要があるを参照してください。

全体として、xmlパーサーはメモリ内の文字列解析用に設計されていません。たとえば、loadXMLはBOMを認識せず、エンコードに制限があります。むしろ、xmlパーサーは、エンコード検出を備えたバイト配列形式用に設計されています。これは、標準のパーサーにとって重要です。MSXMLをより有効に活用するには、IStreamまたはWin32ファイルからのロードを検討してください。

于 2010-08-12T14:29:58.707 に答える
2

私はA2BSTRのファンではありません。少なくとも、返されたBSTRの割り当てが解除されることはないため、メモリリークが発生しています。

あなたも同じように簡単にできます

      VARIANT_BOOL bSuccess = spXMLDOM->loadXML(CComBSTR(xmltext));

これはメモリを適切に処理します。

失敗する理由については、DOMDocumentにparseErrorオブジェクトIXMLDOMParseErrorを要求し、そこから理由を取得できます。これにより、実際の問題が何であるかが明らかになります。

于 2010-01-21T16:41:14.807 に答える
0

を使用しております

hr = m_pXMLDoc->load(_variant_t(xml_file.c_str()), &varStatus);
hr = m_pXMLDoc->loadXML(_bstr_t(xml_doc.c_str()), &varStatus);

それぞれファイルとrawxmlをロードします。

于 2010-08-12T14:40:46.990 に答える