XML schreiben und lesen, aber wie?



  • Hallo Leute,

    ich versuche jetzt schon seit zwei Tagen eine XML Datei zu schreiben b.z.w. zu lesen aber ich weiss nicht wie. Auch die suche im Forum hat mich nicht weitergebracht.Leider!!!

    Was brauche ich dafür?
    Ich benutze BCB6 Pro, und die Komponete TXMLDocument.

    Mein Ziel ist, eine / mehrere XML Dateien zu erstellen und sie bei bedarf auszulesen / ändern b.z.w. erweitern.

    Kann mir jemand einen guten Tip geben? Ich möchte dafür keine Lösung die hilft mir nicht weiter.

    Ich hoffe darauf das jemand einen Ansatz hat damit ich die Lösung selbst finde

    Danke!!

    Gruss Lisa



  • Hast Du Dir schon mal in der Hilfe das Kapitel "TXMLDocument verwenden" durchgelesen?
    Da und in den weiteren Kapiteln steht schon einiges darüber drin.

    Prinzipiell verwendet TXMLDocument das DOM-Modell. Darüber findest Du garantiert Riesenmengen im Internet.
    Grob gesagt wird eine XML-Datei intern als Baum dargestellt, d.h. mit Knoten, die wiederum Unterknoten haben können.
    Die Wurzel des Baumes ist DocumentElement, das selbst vom Typ _di_IXMLNode ist.
    Die Kindknoten erhälst Du über die Eigenschaft ChildNodes, eine Liste von Knoten (wieder vom Typ _di_IXMLNode).

    Um eine XML-Datei zu laden, verwendet man LoadFromFile(), zum Speichern (rate mal) SaveToFile().

    Wo ich reingefallen bin, ist, wenn Du zur Laufzeit eine neue Instanz von TXMLDocument erstellen will.
    Das macht man durch

    _di_IXMLDocument xmlDocument = NewXMLDocument("1.0");
    

    Über die Suchfunktion hier im Forum kannst Du aber ein paar dieser Dinge auch herausfinden.

    Falls Du konkretere Probleme hast, kannst Du ja nochmal nachfragen.

    Gruß,

    Alexander



  • Hallo Alexander,

    erstmal danke für Deine Antwort.

    Wie gesagt ich habe BCB6 Pro.
    Leider ist die Pro Version ohne XML Komponenten. Also was tun? Suchen!!!
    Und gefunden im Borland Developer Network (TXMLDocument).
    Zum Glück ist die Hilfe der Pro. Version fast identisch mit der Enterp. Version.

    Aber irgendwie habe ich da was missverstanden. Also wieder suchen und zwar hier im Forum. Nachdem ich einen Ansatz gefunden hatte, habe ich das sofort im BCB umgesetzt.

    Leider ohne Erfolg!!!!!!

    _di_IXMLDocument XML = LoadXMLDocument(L"test.xml");
    _di_IXMLNodeList NodeList = XML->DocumentElement->ChildNodes; 
    _di_IXMLNode TestNode = NodeList->FindNode(L"Test1");
    
       Memo1->Lines->Add(TestNode->ChildNodes->FindNode(L"Block1")->NodeValue);
       Memo1->Lines->Add(TestNode->ChildNodes->FindNode(L"Block2")->NodeValue);
       Memo1->Lines->Add(TestNode->ChildNodes->FindNode(L"Block3")->NodeValue);
    

    ---------------------------
    Benachrichtigung über Debugger-Exception
    ---------------------------
    Im Projekt Project2.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00401D0F in Modul 'Project2.exe'. Lesen von Adresse 00000000'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
    ---------------------------
    OK Hilfe
    ---------------------------



  • Leider hast Du nicht geschrieben in welcher Zeile der Fehler auftritt.
    Aber eine der ersten drei Zeilen wird wohl den Fehler hervorrufen:

    _di_IXMLDocument XML = LoadXMLDocument(L"test.xml");
    _di_IXMLNodeList NodeList = XML->DocumentElement->ChildNodes; 
    _di_IXMLNode TestNode = NodeList->FindNode(L"Test1");
    

    Entweder kann die XML-Datei nicht geladen werden und XML ist null oder das Wurzelelement hat keine Unterknoten,
    dann ist NodeList null, oder der Knoten Test1 wird nicht in der NodeList gefunden, dann ist TestNode null.

    Deine XML-Datei müsste ja ungefähr so aussehen:

    <WurzelKnotenWieAuchImmerDerHeissenMag>
      <Test1>vielleicht steht hier was, vielleicht auch nicht</Test1>
    </WurzelKnotenWieAuchImmerDerHeissenMag>
    

    Wenn die XML-Datei nicht so ähnlich aussieht, wird das mit dem Code nicht klappen.

    Gruß,

    Alexander



  • Der tritt in dieser Zeile auf

    Memo1->Lines->Add(TestNode->ChildNodes->FindNode(L"Block1")->NodeValue);
    

    und die XML schaut so aus:

    <?xml version="1.0" ?>
    <TEST>
    Dies ist ein Test
    <Block1>Text aus Block1</Block1>
    </TEST>

    Gruß
    Lisa



  • XML ist ziemlich streng. Groß-/Kleinschreibung wird unterschieden.
    Du solltest Dir mal überlegen, was eigentlich Dein DocumentElement ist. Dazu kannst Du auch mal Deine XML-Datei mit
    dem Beispiel, das ich Dir gezeigt habe, vergleichen.

    Setze mal einen Breakpoint an geeigneter Stelle und sieh Dir den Wert von TestNode an.
    Wenn Du nicht weißt, wie man Breakpoints setzt oder prinzipiell mit dem Debugger Probleme hast, solltest Du Dir
    mal das entsprechende Tutorial hier im Forum anschauen.

    Gruß,

    Alexander



  • lisa001 schrieb:

    Mein Ziel ist, eine / mehrere XML Dateien zu erstellen und sie bei bedarf auszulesen / ändern b.z.w. erweitern.

    Kann mir jemand einen guten Tip geben?

    Schau doch einfach mal in die FAQ.



  • Hallo Leute,

    ich wollte mich für eure Hilfe bedanken.
    Ich muss das wohl in der FAQ übersehen haben.

    Da hatte ich nicht nur ein Brett vorm Kopf, sondern auch Tomaten auf den Augen.

    Und nochmals Danke!

    Gruß
    Lisa


Anmelden zum Antworten