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; //--------------------------------------------------------------------------- #endifGefolgt 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); } } //---------------------------------------------------------------------------