IXMLDocument EAccessViolation
-
Hallo,
ich nutze die TXMLDocument Klasse um mit XML zu arbeiten. Da die Methode loadFromFile ja nicht funktionert, bin ich auf das Interface _di_IXMLDocument gekommen. Mein Code sieht folgendermaßen aus:void XMLWrapper::loadFromFile(String File) { delete this->config; _di_IXMLNode Doc = LoadXMLDocument(File); this->config = new TXMLDocument(""); this->config->Options = this->config->Options << doNodeAutoIndent; //Aktivieren der Datei, wichtig zum Bearbeiten this->config->Active = true; //Encodig einstellen. Umlaute lassen grüßen this->config->Encoding = "UTF-8"; this->config->DocumentElement = Doc; }
Wenn ich diesen Code ausführe aut er mir immer eine EAccessViolation Exception raus...kann mir da wer helfen?
-
An welcher stelle kommt denn die Exception?
-
Zeile 11 in diesem Codeschnipsel
-
was ist this->config?
-
zum Laden:
_di_IXMLDocument txd = LoadXMLDocument( File ); _di_IXMLNodeList NodeList = txd->DocumentElement->ChildNodes; for( int i = 0; i < NodeList->GetCount(); i++ ) { ...
zum Erstellen:
TXMLDocument* txd = new TXMLDocument( "" ); txd->Options = txd->Options << doNodeAutoIndent; // für die richtige Formatierung txd->Active = true; // XML Schnittstelle aktivieren, bevor man mit XML arbeitet txd->Encoding = "UTF-8"; ... txd->SaveToFile( File );
grüssle
-
Aber kann ich in irgendeiner Weise das ganze in einem Attribut speichern?
Weil das in einem Objekt läuft....
-
Ok, ich habe das jetzt folgendermaßen versucht zu lösen:
xmlwrapper.h://--------------------------------------------------------------------------- #ifndef xmlwrapperH #include <vcl.h> #include <XMLDoc.hpp> #define xmlwrapperH //--------------------------------------------------------------------------- class XMLWrapper { public: XMLWrapper(); ~XMLWrapper(); void saveToFile(String); void loadFromFile(String); void addBackgroundImage(String); String getBackgroundImage(); void addDesktopIcon(String, String, String, int, int); void getDesktopIcons(); TStringList* iterateDesktopIcon(int); void setUser(String, String); TStringList* getUser(); void setScreenResolution(String, float); TStringList* getScreenResolution(); void setPathToApplicationDir(String); String getPathToApplicationDir(); void setScheduleAlign(bool); bool isAlignAtSchedule(); int iconsCount; TStringList *Next(); bool isEnd(); protected: _di_IXMLNode config; _di_IXMLNodeList icons; int currentIconCount; }; #endif
und Ausschnitte der Cpp Datei:
XMLWrapper::XMLWrapper() { TXMLDocument *lconfig = new TXMLDocument(""); //Zum einrücken der Daten lconfig->Options = lconfig->Options << doNodeAutoIndent << doAutoSave; //Aktivieren der Datei, wichtig zum Bearbeiten lconfig->Active = true; //Encodig einstellen. Umlaute lassen grüßen lconfig->Encoding = "UTF-8"; //erstmal einen Licence-Kommentar erstellen: _di_IXMLNode CNode = lconfig->CreateNode(L"File generated by Eggman Project. (c) 2009 - All rights reserved", ntComment, ""); lconfig->ChildNodes->Add(CNode); //Rootknoten erstellen. Den gibt es nur einmal lconfig->DocumentElement = lconfig->CreateElement(L"eggman", ""); this->config = lconfig->DocumentElement; //Anzahl der eingelesenen Icons initialisieren this->iconsCount = 0; this->currentIconCount =0; } void XMLWrapper::saveToFile(String File) { String xml =this->config->GetXML(); TStringList *save = new TStringList(); save->Add(xml); save->SaveToFile(File); } void XMLWrapper::loadFromFile(String File) { _di_IXMLDocument txd = LoadXMLDocument( File ); this->config = txd; }
Das Funktioniert auch soweit. Wenn ich txd->GetXML(); ausführe gibt er mir das richtige zurück.
Nur wenn ich jetzt_di_IXMLNode user = this->config->ChildNodes->GetNode(WideString("user"));
ausführe kommt die allseits bekannte und beliebte Fehlermeldung:
Im Projekt Priject1.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 004031A4 in Modul 'Project1.exe'.Lesen von Adresse 000000000' aufgetreten.
Kann mir da jemand helfen?