XML mit BCB6 Prof.
-
Ich will "einfach" folgenden XML-Code einlesen und bearbeiten
<Adresse> <No1> <Name>Ich</Name> <Tel>87654321</Tel> </No1> <No2> <Name>Du/Name> <Tel>1232121</Tel> </No2> </Adresse>
leider kann ich die in der Hilfe beschriebene Komponente unter Internet nicht finden. (Kann das an der Version liegen - BCB6 Prof.)
Die beschriebene Klasse TXMLDocument gibt es aber. Also habe ich die Klasse selbst erzeugt, die Datei zugewiesen, auf active gesetzt. Nun wollte ich - wie in der Hilfe ***"Mit XML-Knoten arbeiten"***beschrieben auf die Knoten zugreifen.TXMLDocument * XMLDoc1; XMLDoc1 = new TXMLDocument ("c:\\projects\\xml\\adr.xml"); XMLDoc1->Active = true; _di_IXMLNode Adress = XMLDoc1->DocumentElement->ChildNodes[0];
Ich bekomme bei der letzten Zeile bei der Ausführung eine EAccessViolation (Adresse000000).
????
Hilfe!!!Bibo
-
W*****einlich, weil TXMLDocument wird nur in der Enterprise Version unterstützt.
-
Hi, Allesamt!
Ich hatte mal irrtümlich behauptet, dass BCB 6 Pro XML nicht unterstützt.
Ist nicht ganz korrekt. BCB6 Pro stellt zwar keine XML Komponenten bereit,
aber man kann durchaus mit XML arbeiten. Ich habe ein Bsp. gebastelt, wo
folgende XML Datei erstellt und dann gelesen wird:<?xml version="1.0" encoding="UTF-16" ?> <!-- Dies ist eine maschinell erstellte XML Datei. Bitte nicht ändern! --> <LICENCE> <CUSTOMER> <NAME>Herr Musterrmann</NAME> <FIRMA>Dr. Muster & Mann GmbH</FIRMA> </CUSTOMER> <MODULES> <MODULID xmlns="{4C14FD54-9E76-456A-AE1B-C12B028039AE}" /> </MODULES> <LICENCE_KEY xmlns="E49CE947EA77D87605727941037E9019" /> </LICENCE> //----------------------------------------- // Datei erstellen // ! #include <XMLDoc.hpp> ... try { // Erstellen einer XML Datei TXMLDocument *XML = new TXMLDocument(""); // WICHTIG: kein Datei Namen übergeben, sonst Exception XML->Options = XML->Options << doNodeAutoIndent; // für die richtige Formatierung XML->Active = true; // XML Schnittstelle aktivieren, bevor man mit XML arbeitet XML->Encoding = "UTF-16"; // Encoding festlegen, damit auch z.B. Umlauten richtig rüberkommen // Kommentar erstellen _di_IXMLNode CNode = XML->CreateNode(L"Dies ist eine maschinell erstellte XML Datei. \ Bitte nicht ändern!", ntComment, ""); // zum Documen hinzufügen XML->ChildNodes->Add(CNode); // Hauptknoten erstellen. WICHTIG: "Es kann nur einen geben" ;) XML->DocumentElement = XML->CreateElement(L"LICENCE", ""); // Unterknoten mit Namen "CUSTOMER" erstellen _di_IXMLNode FirmaNode = XML->DocumentElement->AddChild(L"CUSTOMER"); // Für "CUSTOMER" Unterknoten "NAME" erstellen, den Knotenwert setzen und zu der "CUSTOMER"-Knotenliste hinzufügen _di_IXMLNode Node = XML->CreateElement(L"NAME", L""); Node->NodeValue = WideString(EdtName->Text); FirmaNode->ChildNodes->Add(Node); // Für "CUSTOMER" Unterknoten "FIRMA" erstellen, den Knotenwert setzen und zu der "CUSTOMER"-Knotenliste hinzufügen Node = XML->CreateElement(L"FIRMA", L""); Node->NodeValue = WideString(EdtFirma->Text); FirmaNode->ChildNodes->Add(Node); // Für Haupknoten Unterknoten "MODULES" erstellen _di_IXMLNode ModulNode = XML->DocumentElement->AddChild(L"MODULES"); // Elment "MODULID" mit Namespace erstellen und der Liste von ModulNode zuweisen Node = XML->CreateElement(L"MODULID", L"{4C14FD54-9E76-456A-AE1B-C12B028039AE}"); ModulNode->ChildNodes->Add(Node); // Element "LICENCE_KEY" mit Namespace erstellen und der Liste des Hauptknoten zuweisen XML->DocumentElement->ChildNodes->Add( XML->CreateElement(L"LICENCE_KEY", L"E49CE947EA77D87605727941037E9019") // XML Dokument in eine Datei abspeichern XML->SaveToFile("lic.xml"); // Instanz Von XML löschen delete XML; ) catch(Exception &e) { MessageBox(Handle, e.Message.c_str(), "Fehler", MB_ICONERROR); } //----------------------------------------- // XML Datei lesen // ! #include <XMLDoc.hpp> ... try { // Lesen einer XML Datei _di_IXMLDocument XML = LoadXMLDocument(L"lic.xml"); // WICHTIG: keine Instanz von XMLDocument mit new erstellen, // sonder mit LoadXMLDocument Datei laden. Sonst: verschiedene unerklärliche Fehler, // wie z.B. Formular verschwindet usw. // NodeList ist eine Liste der Unterknoten des ROOT-Knoten _di_IXMLNodeList NodeList = XML->DocumentElement->ChildNodes; // info zum "CUSTOMER" lesen: "CUSTOMER" suchen und den Wert der Unterknoten auslesen _di_IXMLNode FirmaNode = NodeList->FindNode(L"CUSTOMER"); String LicName = FirmaNode->ChildNodes->FindNode(L"NAME")->NodeValue; String LicFirma = FirmaNode->ChildNodes->FindNode(L"FIRMA")->NodeValue; // " MODULES " suchen _di_IXMLNode ModNode = NodeList->FindNode(L"MODULES"); // alle Unterknoten abrufen for (int i = 0; i < ModNode->ChildNodes->Count; i++) { // Namespace als Attribut lesen : "{4C14FD54-9E76-456A-AE1B-C12B028039AE}" String MID = ModNode->ChildNodes->Get(i)->GetAttribute(L"xmlns"); } // Prüfsumme als Attribut lesen String Hash = NodeList->FindNode(L"LICENCE_KEY")->GetAttribute(L"xmlns"); } catch(Exception &e) { MessageBox(Handle, e.Message.c_str(), "Lizenzierung", MB_ICONERROR); } // WICHTIG: Diese Instanz von XMLDocument muss nicht gelöscht werden, da sie // automatisch freigegeben, sobald der Referenzzähler ihrer // IXMLDocument-Schnittstelle den Wert Null erreicht.
Das ist schon alles
-
Ich hatte eigentlich schon aufgegeben. War total überrascht, dass es noch eine (positive) Antwort für XML gibt.
Klasse, dass Du Dich noch daran erinnert hast. Werde es gleich mal ausprobieren.
Bibo