2 Stimmen

MSXML's loadXML kann selbst gut geformtes Xml nicht laden

Ich habe einen Wrapper auf MSXML in C++ geschrieben. Die Lademethode sieht wie folgt aus. Das Problem mit dem Code ist es scheitert gut gebildet xml manchmal zu laden.

Bevor ich die xml als String übergebe, führe ich eine Stringsuche nach xmlns durch und ersetze alle Vorkommen von xmlns durch xmlns:dns. Im folgenden Code entferne ich das Zeichen bom. Dann versuche ich mit der MSXML loadXML Methode zu laden. Wenn das Laden erfolgreich ist, setze ich den Namespace wie im Code gezeigt.

 Class XmlDocument{

        MSXML2::IXMLDOMDocument2Ptr spXMLDOM;
         ....
    }

// XmlDocument-Methoden

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;

    }

Ich habe versucht zu debuggen, konnte aber nicht herausfinden, warum loadXML() manchmal nicht einmal gut geformte XML-Dateien laden kann. Was mache ich falsch im Code. Jede Hilfe ist sehr zu schätzen.

Danke JeeZ

3voto

Samuel Zhang Punkte 1260

Zu diesem speziellen Problem siehe An loadXML übergebene Strings müssen UTF-16 kodierte BSTRs sein .

Insgesamt ist ein Xml-Parser nicht für das Parsen von Strings im Speicher ausgelegt, z.B. erkennt loadXML kein BOM und hat Einschränkungen bei der Kodierung. Vielmehr ist ein Xml-Parser für die Byte-Array-Form mit Kodierungserkennung ausgelegt, was für einen Standard-Parser entscheidend ist. Um MSXML besser zu nutzen, sollten Sie das Laden aus IStream oder einer Win32-Datei in Betracht ziehen.

2voto

Ruddy Punkte 1704

Ich bin kein Fan von A2BSTR - zumindest sind Sie undicht Speicher als die zurückgegebene BSTR ist nie deallocated.

Sie könnten genauso gut

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

Dadurch wird der Speicher ordnungsgemäß verwaltet.

Als zu, warum seine fehlgeschlagen - Sie können das DOMDocument für seine parseError-Objekt IXMLDOMParseError fragen und dann den Grund von ihm abrufen - das wird wahrscheinlich mehr Licht auf was das eigentliche Problem ist vergießen.

0voto

graham.reeds Punkte 15745

Wir verwenden

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

Für das Laden von Dateien bzw. Roh-Xml.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X