MSXML in C++ verwenden



  • Hallo,

    ich möchte eine XML-Datei auslesen und die Werte dann als CSV-Datei
    abspeichern. Mein Problem ist bereits, dass ich mit MSXML noch nie
    gearbeitet habe und nicht sicher bin wie ich es richtig einbinde.

    Kann mir jemand eine Einstiegsseite zum Thema MSXML mit C++ empfehlen?

    Mein erster Versuch war soetwas hier:

    #import  <msxml6.dll> 
    using namespace MSXML2; 
    
    //...
    
    MSXML2::IXMLDOMDocument * pXMLDoc=NULL;
    MSXML2::IXMLDOMNode * pXDN=NULL;
    
    BSTR file;
    CString x = "c:\\test.xml";
    file=x.AllocSysString();
    
    pXMLDoc->loadXML(file);
    

    Im Debugger zeigt er mir dann, dass er bei msxml6.tli:

    HRESULT _hr = raw_loadXML(bstrXML, &_result);
    

    aussteigt und eine Exception im Programm auftritt.
    Dort werden ja auch zwei Parameter für loadXML ertwartet...
    Mixe ich hier bereits alles wild durcheinander 😕



  • pXMLDoc ist NULL. Du musst zuerst ein Objekt erzeugen.
    Du könntest nebenbei auch gerade die XXPtr Varianten nehmen, das sind typedefs für Smart Pointer.

    Ausserdem musst Du die Methode load(..) nicht loadXML benutzen. loadXML(..) erwartet ein String, welcher XML enthält. load(..) erwartet ein Pfad zu einem XML File.

    Hier mal ein Snippet, ev. hilfts weiter:

    MSXML2::IXMLDOMDocumentPtr document;
    document.CreateInstance(L"MSXML2.DOMDocument");
    document->validateOnParse = VARIANT_TRUE;
    if (VARIANT_FALSE == document->load(L"c:\\test.xml"))
    {
    	IErrorInfo* errorInfo = 0;
    	ICreateErrorInfo* createErrorInfo;
    	if(SUCCEEDED(CreateErrorInfo(&createErrorInfo)))
    	{
    		MSXML2::IXMLDOMParseErrorPtr parseError = document->parseError;
    		createErrorInfo->SetDescription(parseError->reason);
    		createErrorInfo->QueryInterface(&errorInfo);
    	}
    	_com_raise_error(E_INVALIDARG, errorInfo);
    }
    

    Simon



  • Hi Simon,

    dein Code kompiliert wunderbar, ich schmiere allerdings dann
    doch am Ende in comip.h beim "return m_pInterface" ab:

    // Allows this class to be used as the interface itself.
        // Also provides simple error checking.
        //
        Interface* operator->() const 
        { 
            if (m_pInterface == NULL) {
                _com_issue_error(E_POINTER);
            }
    
            return m_pInterface; //hier knallt es
        }
    

    Ich habe mal nachträglich die comdef.h included, aber mehr fällt mir
    dazu nicht ein 😕



  • Was gibt

    document.CreateInstance(L"MSXML2.DOMDocument");
    

    zurück?



  • Hast Du die COM Runtime initailisiert?
    Mit CoInitialize(..) und dann CoUnInitialize(..).

    Simon



  • CoInitialize(0);
    

    ...das wars. Ich danke euch vielmals 🙂


Log in to reply