Probleme beim Auslesen eines TXMLDocuments
-
Hallo zusammen,
ich habe ein Problem oder stehe gerade ganz arg auf dem Schlauch.
Ich versuche lediglich ein selbstgeschriebenes XML-Dokument auszulesen.void Lader::XMLAuslesen() { TXMLDocument* dokument = new TXMLDocument("Neu.xml"); dokument->LoadFromFile("neu.xml"); dokument->Active = true; _di_IXMLNode knoten = dokument->DocumentElement; int x = 0; }
So versuche ich es. In der Zeile dokument->DocumentElement erhalte ich eine AccessViolation zur Laufzeit.
Diese einfache XML-Datei nutze ich:
<?xml version="1.0" encoding="UTF-8"?>
<Objekt>
<Name>Eins</Name>
<Nummer>0815</Nummer>
</Objekt>Kann mir jemand helfen?
Danke,
Oliver
-
das hier...
_di_IXMLDocument dokument; dokument = LoadXMLDocument("Neu.xml"); dokument->Active = true; _di_IXMLNode knoten = dokument->DocumentElement; AnsiString text = knoten->GetNodeName();
Jetzt verstehe ich noch weniger. Der Rest des Codes ist unverändert. Die XML-Datei auch.
-
Hi,
probiers mal damit:
String MDBFile="blabla.xml"; TXMLDocument *XMLLoadDoc= new TXMLDocument(Form1); if (FileExists(MDBFile)) { XMLLoadDoc->LoadFromFile(WideString(MDBFile)); XMLLoadDoc->Active=true; _di_IXMLNode test=XMLLoadDoc->DocumentElement->ChildNodes->FindNode(L"Objekt"); ShowMessage(test->ChildNodes->FindNode(L"Name")->Text); }
Gruß
Hawk
-
Also,
wenn du das XML-Dokument selbst erstellt hast, dann wie hast du das gemacht? Mit einem einfachen Editor wie NotePad? Wenn ja, dann ist das Dokument wahrscheinlich nicht in Unicode UTF-8, wie es im Header der XML beschrieben ist. Dann kommt natürlich auch eine Fehlermeldung auch wenn der Programm-Code richtig sein sollte.
NotePad speichert nämlich alles erstmal in ASCII.
Gruß
Hawk
-
Hallo und vielen Dank für die Hilfe.
Leider erfolglos.
Beim Kompilieren deines Quellcodes erhalte ich die Meldung:Keine Übereinstimmung TXMLDocument:TXMLDocument(TForm1*) gefunden;
Ja, meine Form heißt TForm1.Meine zuvor gepostete Lösung funktioniert weiterhin, auch, wenn es vielleicht das falsche Format ist. Ich dachte, der Zeichensatz sagt nur aus, wie bestimmte Sonderzeichen interpretiert werden. Das dürfte die Substanz des gesamten Dokumentes ja nicht in Frage stellen, oder doch?
ich habe an anderer Stelle aber gelesen, dass TXMLDocument beim dynamischen Anlegen öfter Probleme bereitet. Vielleicht werde ich diese Erklärung als Lösung einfach akzeptieren.
-
Hallo,
ich verwende TXMLDocument sehr oft und schon seit Jahren und hatte damit noch nie Probleme (C++Builder XE2).
Hier ein Beispiel, wie ich eine XML-Datei öffne:
AnsiString asXMLDatei = "C:\\Pfad\\Dateiname.XML"; TXMLDocument *XMLDoc = new TXMLDocument(this); // this = TForm if(XMLDoc != NULL && FileExists(asXMLDatei) == true) { XMLDoc->DOMVendor = MSXML_DOM; XMLDoc->Active = false; XMLDoc->Active = true; XMLDoc->Version = "1.0"; XMLDoc->Encoding = "UTF-8"; XMLDoc->FileName = asXMLDatei; XMLDoc->LoadFromFile(XMLDoc->FileName); IXMLNode *NodeMain = XMLDoc->DocumentElement; if(NodeMain != NULL) { } .... delete XMLDoc; }
Das Setzen von XMLDoc->Active auf false, bevor es dann auf true gesetzt wird, habe ich vor Jahren so eingebaut und bei neuen Projekten immer wieder so übernommen. Vermutlich gab es damals an der Stelle Probleme, den genauen Grund weiß ich aber nicht mehr. Auf jeden Fall hatte ich mit diesem Programmcode noch nie Probleme.
Das sind die eingebundenen Haeder:
#include <msxmldom.hpp> #include <XMLDoc.hpp> #include <xmldom.hpp> #include <XMLIntf.hpp>
Gruß
Josef
-
Stimmt, der this-Zeiger ist besser.
@OliverKohl
Also bei UTF-8 werden in der XML-Datei für jedes Zeichen 2 Bytes verwendet. Bei ASCII aber nur 1 Byte. Sollte die Datei als ASCII gespeichert sein aber in der XML steht UTF-8, dann kann die Datei nicht richtig eingelesen werden und eine Access-Violation tritt ein.
Also aufpassen. Oder du nimmst von Anfang an statt Unicode ASCII (ISO-10646-UCS-2), aber dann kannst du nicht so viele verschieden Zeichen speichern.Gruß
Hawk
-
Danke euch,
dieser Tipp hat geholfen. Für mich war der technische Background an der Stelle nicht verständlich. Ich dachte, wie gesagt, es sei lediglich der Umfang der Zeichen relevant.
Dann weiss ich jetzt, worauf ich achten muss.
Vielen Dank.
War eine nette und gute Hilfe.Oliver