Probleme mit LoadXML()

lukasS

Erfahrenes Mitglied
Hallo,

folgende Frage: Wenn ich eine XML erstellen will, übergebe ich als Parameter der loadXML()-Methode diese ISO-Geschichte. Leider wird das nicht in der XML angezeigt. Egal was ich in die LoadXML reinschreibe, wird nicht angezeigt. Dafür kann ihc mit weiteren IXMLDOMElementen Elemente und Attribute erstellen, speichern usw. Bestimmt habe ich was vergessen, aber was? Hier der code:

Code:
MSXML2::IXMLDOMDocumentPtr pDocWrite;
pDocWrite.CreateInstance(__uuidof(MSXML2::DOMDocument));
pDocWrite->loadXML(_bstr_t("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?/>\n<hallo />"));
MSXML2::IXMLDOMElementPtr pEle = pDocWrite->createElement(_bstr_t("EinElement"));
...
pDocWrite->save(....);

Warum steckt er nicht den Inhalt von dem loadXML rein. Habe shcon alle Varianten ausprobiert, auch die load()-Methode, mit CString, Konvertierungen, UTFs und und und. Muss also was vergessen haben, aber was?

Danke schonmal!

Lukas

PS: Benutze XP, VC++ 2005 (spielt hierbei aber keine Rolle) und msxml3.dll (hierbei kein Unterschied zu msxml4.dll).
 
Hi.

Eine XML Processing Instruction wird mit "?>" abgeschlossen und nicht mit "?/>".

Außerdem solltest du prüfen ob das Laden des XML Strings erfolgreich war bevor du weiterarbeitest. Die Methode load kannst du verwenden um ein Dokumen aus einer Datei zu laden.

Gruß
 
Wie gesagt, habe das auch schon ausprobiert. Prüfen mache ich auch. Danke trotzdem!

Lukas
 
Das Projekt ist zu Umfangreich, habe die gleich Funktion start verkürzt nochmal erstellt:

Fehlt nur noch:

#import <msxml3.dll> named_guids
using namespace MSXML2;

Code:
...

	CoInitialize(NULL);

	MSXML2::IXMLDOMDocumentPtr pDocWrite;
	pDocWrite.CreateInstance(__uuidof(MSXML2::DOMDocument));

	HRESULT hr = pDocWrite->loadXML(_bstr_t("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"));
	if(hr)
		return 0;


	MSXML2::IXMLDOMElementPtr pTestEle1 = pDocWrite->createElement(_bstr_t("TestElement1"));
	if (pTestEle1 == NULL)
		return 0;
	pDocWrite->appendChild(pTestEle1);

	MSXML2::IXMLDOMElementPtr pTestEle2 = pDocWrite->createElement(_bstr_t("TestElement2"));
	if (pTestEle2 == NULL)
		return 0;
	pTestEle2->text = _bstr_t("Ein Wert");
	pTestEle1->appendChild(pTestEle2);

	pDocWrite->save(_variant_t("D:\\source\\XML\\test2.xml"));

Also wie gesagt, mir geht es nur um die "<?xml version="1.0" encoding="ISO-8859-1"?>"-Stelle.

Gruß

Lukas
 
Also bei mir funktioniert's. Du solltest allerdings beachten, dass die xml Eigenschaft des IXMLDOMDocument immer einen UTF-8 String enthält.

Gruß
 
Also ich meinte natürlich das es mit meinem Code den ich kurz geschrieben habe klappt. Mit dem Code den du gepostet hast natürlich nicht, weil du an die loadXML Methode kein wohlgeformtes XML übergeben hast. Ein XML Dokument muß genau einen Root Knoten haben - was bei dir nicht der Fall ist. So wird der String auch nicht geladen.

Die Funktion gibt übrigens ein HRESULT zurück und keinen boolschen Wert. Du kannst mit dem Makro FAILED prüfen ob die Methode erfolgreich war oder nicht:
C++:
if FAILED(hr) {
...
}

/edit: Nein, das war falsch. Du hast mich verwirrt. Die Methode gibt kein HRESULT zurück sondern einen boolschen Wert der angibt ob die Methode erfolgreich war. Wenn die Methode erfolgreich war beendest du das Programm und gibst den Wert 0 zurück. D.h. du mußt da natürlich
C++:
if (!hr) return 1;
schreiben.

Gruß

PS: Wenn ein Fehler auftritt solltest du übrigens einen Wert verschieden von 0 zurückgeben.
 
Zuletzt bearbeitet:
Hallo,

danke für deine Hilfe! Habe es endlich entdeckt, habe die ganze Zeit nach der Funktion createProcessingInstruction() gesucht.

Gruß

Lukas
 
Zurück