In Xml-Datei schreiben



  • Hallo,
    ich habe mal wieder ein Problem mit Xml.
    Naja, mit der Behandlung von C++ aus (mit MSXML6).
    Ich würde gerne in eine vorhandene Xml-Datei schreiben.
    Habe einiges dazu gelesen und auch schon einiges probiert, aber es wollte nie so ganz klappen.
    Jetzt habe ich hier: http://msdn.microsoft.com/en-us/libr...55(VS.85).aspx ein fertiges Beispiel gefunden und wollte es bei mir ausprobiere.
    Hier der Code.

    try
    {
    	MSXML2::IXMLDOMDocumentPtr docPtr;
    
    	//init
    	TESTHR(CoInitialize(NULL)); 
    	TESTHR(docPtr.CreateInstance("Msxml2.DOMDocument.6.0"));
    
    	// load a document
    	_variant_t varXml(_T("C:\\...\\Desktop\\bool.xml"));
    	_variant_t varOut((bool)TRUE);
    	varOut = docPtr->load(varXml);
    	if ((bool)varOut == FALSE)
    	{// show error description - IXMLDOMParseError sample
    	           MSXML2::IXMLDOMParseErrorPtr errPtr = docPtr->GetparseError();
    		_bstr_t bstrErr(errPtr->reason);
    
    		_tprintf(_T("Error:\n"));
    		_tprintf(_T("Code = 0x%x\n"), errPtr->errorCode);
    		_tprintf(_T("Source = Line : %ld; Char : %ld\n"), errPtr->line, errPtr->linepos);
    		_tprintf(_T("Error Description = %s\n"), (char*)bstrErr);
    	}
    	else
    	{// dom fragment sample
    
    		// create a new node and add to the doc
    		_variant_t varTyp((short)MSXML2::NODE_ELEMENT);
    		_bstr_t varName(_T("BOOK"));
    		MSXML2::IXMLDOMNodePtr nodePtr= docPtr->createNode(varTyp, varName, "");
    		// create a doc fragment and associate the new node with it
    		MSXML2::IXMLDOMDocumentFragmentPtr fragPtr = docPtr->createDocumentFragment();
    		fragPtr->appendChild(nodePtr);
    		// add some elements to the new node
    		varName = _T("TITLE");
    		MSXML2::IXMLDOMNodePtr nodePtr1= docPtr->createNode(varTyp, varName, "");
    		nodePtr1->text = _T("Creepy Crawlies");
    		varName = "AUTHOR";
    		MSXML2::IXMLDOMNodePtr nodePtr2= docPtr->createNode(varTyp, varName, "");
    		nodePtr2->text = _T("Stefan Knorr");
    		nodePtr->appendChild(nodePtr1);
    		nodePtr->appendChild(nodePtr2);
    		// display the fragment contents
    		MessageBox(NULL, fragPtr->xml, _T(""), MB_OK);
    		// add the fragment to the original doc
    		docPtr->documentElement->appendChild(fragPtr);
    		// display the modified doc contents
    		MessageBox(NULL, docPtr->xml, _T(""), MB_OK);
    	}
    
    }
    catch (_com_error &e)
    {
    	_tprintf(_T("Error:\n"));
    	_tprintf(_T("Code = %08lx\n"), e.Error());
    	_tprintf(_T("Code meaning = %s\n"), (char*) e.ErrorMessage());
    	_tprintf(_T("Source = %s\n"), (char*) e.Source());
    	_tprintf(_T("Error Description = %s\n"), (char*) e.Description());
    }
    catch(...)
    {
    	_tprintf(_T("Unknown error!"));
    }
    CoUninitialize();
    return 0;
    

    Die Xml-Datei wird geladen und das Programm korrekt Schritt für Schritt durchlaufen.
    Und am Ende werden mir die beiden MessageBoxen

    MessageBox(NULL, fragPtr->xml, _T(""), MB_OK);
    // add the fragment to the original doc
    docPtr->documentElement->appendChild(fragPtr);
    // display the modified doc contents
    MessageBox(NULL, docPtr->xml, _T(""), MB_OK);
    

    mit dem korrekten Inhalt angezeigt.
    So weit so gut. Nur leider ist die Xml-Datei danach unverändert.
    Hoffe jemand hat Erfahrungen in der Richtung und kann mir Helfen.

    Gruß Janinoe



  • Du veränderst nur die Daten im Speicher. Erst mit docPtr->save wird die geänderte Datei gespeichert.



  • Oh mein Gott. Und ich verbringe Stunden damit, eine Lösung zu finden 😮
    Vielen vielen Dank. Mein Tag ist gerettet 😃

    Gruß Janinoe


Anmelden zum Antworten