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?


Anmelden zum Antworten