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


Anmelden zum Antworten