Problem mit XML-Dateien einlesen



  • Hallo, ich folgendes Problem.
    Ich kann keine XML-Daten einlesen. Ich nutze eine Klasse. Von dieser wird eine Instanz erstellt, bei dem der Konstrukter einen Pfad der XML-Datei zugewiesen bekommt.

    Hier erstmal die Headerdatei:

    #ifndef UnitXMLClassH
    #define UnitXMLClassH
    
    #include <vcl.h>
    #include <XMLDoc.hpp>
    //---------------------------------------------------------------------------
    class XMLData
    {
    	// private deklarierte Klassenvariablen und Methoden
    	private:
    		// Variablen
    		_di_IXMLDocument XMLFile;              		   	// XML-Dokument
    		_di_IXMLNodeList XMLNodeList;                   // XML-Knoten
    		_di_IXMLNode XMLValueNode;                      // XML-Knotenname
    		int NodeNum;                                    // Anzahl der Knoten
    
    		// Methoden
    		AnsiString __fastcall getXMLValue(AnsiString Prefix, AnsiString Id, AnsiString ReturnValue);
    
    	// public deklarierte Klassenvariablen und Methoden
    	public:
    		// Konstruktor, Destruktor
    		__fastcall XMLData(AnsiString FilePath);
    		~XMLData(){}
    
    	// protected deklarierte Klassenvariablen und Methoden
    	protected:
    };
    extern XMLData ObjectText;
    //---------------------------------------------------------------------------
    #endif
    

    Gefolgt von der CPP-Datei:

    #pragma hdrstop
    
    #include "UnitXMLClass.h"
    
    #pragma package(smart_init)
    
    //---------------------------------------------------------------------------
    
    XMLData ObjectText(ExtractFilePath(Application->ExeName)+"ObjectText.xml") ;
    
    // Konstruktor
    __fastcall XMLData::XMLData(AnsiString FilePath)
    {
    /*
    Übergabewerte :
    AnsiString File		-	Deiteiname bzw. Pfad der XML-Datei auf die zugegriffen werden soll
    */
    	try {
    //Hier tritt das Problem auf
    		XMLFile	 	= LoadXMLDocument(FilePath);					// XML-Datei öffnen
    		XMLNodeList = XMLFile->DocumentElement->ChildNodes;         // XML-Knoten einer Liste zuordnen
    		NodeNum 	= XMLNodeList->Count;         					// Anzahl der Knoten in Variable sichern
    	} catch (...) {
    		try	{
    			throw Exception("XML-File error!");
    		}
    		catch (Exception &exception) {
    			Application->ShowException(&exception);                 // Sollte es ein Problem beim öffnen der Datei geben, wird eine Fehlermeldung ausgegeben
    		}
    	}
    }
    //---------------------------------------------------------------------------
    
    // Get-Funktion getXMLValue
    // Sucht nach XML-Wert in XML-Datei
    // XML-Datei muss besonderes Format aufweisen
    AnsiString __fastcall XMLData::getXMLValue(AnsiString Prefix, AnsiString Id, AnsiString ReturnValue)
    {
    /*
    Übergabewerte:
    --------------
    AnsiString	Prefix				-	Suchvariable Prefix in XML-Datei
    AnsiString	Id					-	Suchvariable Id in XML-Datei
    AnsiString	ReturnValue         -	Sollte die Suche nach Id und Prefix nicht erflogreich sein, wird dieser Wert zurückgegeben
    
    Funktionsvariablen :
    --------------------
    AnsiString NodePrefix			-	Vergleichsvariable dient zum zwischenspeichern vom Prefix der XML-Datei
    AnsiString NodeId				-	Vergleichsvariable dient zum zwischenspeichern von der Id der XML-Datei
    */
    	//	Funktionsvariablen
    	AnsiString NodePrefix;
    	AnsiString NodeId;
    
    	for (int i = 0; i < this->NodeNum; i++) {
    		XMLValueNode = XMLNodeList->Nodes[i];                                   	// Knoten wird ausgewählt
    		NodePrefix = XMLValueNode->GetAttribute("prefix");              // Sichern vom Prefix des Knotens
    		NodeId = XMLValueNode->GetAttribute("id");                      // Sichern der Id des Knotens
    		if (NodePrefix == Prefix && NodeId == Id ) {                                // Vergleich ob Prefix und Id den gesuchten Werten entsprechen
    			ReturnValue = XMLValueNode->ChildNodes->FindNode("deu")->NodeValue;     // Wert des Knotens in jeweiliger Sprache sichern um diesen zu übergeben
    			return ReturnValue;														// Übergabe des gefundenen Werts
    		}
    	}
    	return ReturnValue; 															// Sollte kein Wert gefunden worden sein, wir der Standartwert überbgeben
    }
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    

    Nun stelle ich auch noch meine XML-Datei dar:

    [code]<?xml version="1.0" encoding="ISO-8859-1"?>

    <text-list>

    <text prefix="Language" id="LB_Lang">
    <deu><![CDATA[Deutsch]]></deu>
    <eng><![CDATA[English]]></eng>
    </text>

    </text-list>
    [cpp]

    Diese XML-Datei befindet sich im gleichen Ordner wie die EXE-Datei der Applikation.
    Ich nutze den C++ Builder 2007!

    Entgegen aller meiner Versuche, wird eine Exeption in meinem Try-Catch-Block (an der markierten Stelle) im Konstruktor ausgelöst.

    Was ist verkehrt?

    Beachte ich etwas nicht?

    Bitte um Hilfe.



  • Hallo

    Den Sinn und Zweck von Exceptions hast du noch nicht richtig verstanden...

    try {
    //Hier tritt das Problem auf
            XMLFile         = LoadXMLDocument(FilePath);                    // XML-Datei öffnen
            XMLNodeList = XMLFile->DocumentElement->ChildNodes;         // XML-Knoten einer Liste zuordnen
            NodeNum     = XMLNodeList->Count;                             // Anzahl der Knoten in Variable sichern
        } catch (Exception &exception) {
                Application->ShowException(&exception);                 // Sollte es ein Problem beim öffnen der Datei geben, wird eine Fehlermeldung ausgegeben
    
        }
    

    So wird die originale Exception angezeigt. Vielleicht hilft die ja weiter.

    bye
    Stefan Hempel



  • Ich probiere es mal,
    dann schreibe ich. Danke dir erstmal.



  • Als Ausgabe erhalte ich nun :

    "CoInitialize wurde nicht aufgerufen"

    Was bedeutet das? Was beduetet das für den Quelltext? Was muss ich ändern? 😕
    Bitte nochmals um Hilfe. 😞



  • Habe das Problem selber gelöst. Dauerte nur ca. 1 nervigen Tag.
    Hier die Lösung:

    XMLData ObjectText (ExtractFilePath(Application->ExeName)+"ObjectText.xml") ;
    
    // Konstruktor
    __fastcall XMLData::XMLData(AnsiString FilePath)
    {
    /*
    Übergabewerte :
    AnsiString File		-	Deiteiname bzw. Pfad der XML-Datei auf die zugegriffen werden soll
    */
    // Initialisierung (CoInitialized) ist vorab erforderlich!!!!!!
    	CoInitialize(NULL);
    	try {
    		XMLFile	 	= LoadXMLDocument(FilePath);					// XML-Datei öffnen
    		XMLNodeList = XMLFile->DocumentElement->ChildNodes;         // XML-Knoten einer Liste zuordnen
    		NodeNum 	= XMLNodeList->Count;         					// Anzahl der Knoten in Variable sichern
    	} catch (Exception &exception) {
    			Application->ShowException(&exception);
    	}
    }
    //---------------------------------------------------------------------------
    

Anmelden zum Antworten