Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Parsen mit TXMLDocument (https://www.delphipraxis.net/126671-parsen-mit-txmldocument.html)

rd3 30. Dez 2008 16:56


Parsen mit TXMLDocument
 
Hallo,

ich habe mal eine Frage: Wie könnte ich folgenden XML Quelltext so parsen, dass ich folgende Stellen auslesen kann (über eine Schleife z.B.)...

Auszulesende Stellen:

<concept>ABC</concept>
<transac type="create">User1</transac>
<date>2003-07-14T13:05:29</date>
<language type="de" lang="DE"/>
<term>Haus</term>
<descrip type="status">bevorzugt</descrip>
aus
<transacGrp>
<transac type="create">DF</transac>
<date>2007-01-01T13:54:03</date>
<transacGrp>
<transac type="change">DF</transac>
<date>2008-08-01T13:54:03</date>
</transacGrp>

XML-Code:
<?xml version="1.0" encoding="UTF-16"?>
<mtf>
   <conceptGrp>
      <concept>ABC</concept>
      <transacGrp>
         <transac type="create">User1</transac>
         <date>2003-07-14T13:05:29</date>
      </transacGrp>
      <transacGrp>
         <transac type="change">User2</transac>
         <date>2005-01-20T18:03:01</date>
      </transacGrp>
      <languageGrp>
         <language type="de" lang="DE"/>
         <termGrp>
            <term>Haus</term>
            <descripGrp>
               <descrip type="status">bevorzugt</descrip>
            </descripGrp>
            <descripGrp>
               <descrip type="source">XY</descrip>
            </descripGrp>
            <transacGrp>
               <transac type="create">DF</transac>
               <date>2007-01-01T13:54:03</date>
            </transacGrp>
            <transacGrp>
               <transac type="change">DF</transac>
               <date>2008-08-01T13:54:03</date>
            </transacGrp>
         </termGrp>
      </languageGrp>
      </languageGrp>
      <languageGrp>
         <language type="de" lang="FR"/>
         <termGrp>
            <term>Maison</term>
            <descripGrp>
               <descrip type="status">preferrer</descrip>
            </descripGrp>
            <descripGrp>
               <descrip type="source">XY</descrip>
            </descripGrp>
            <transacGrp>
               <transac type="create">DF</transac>
               <date>2007-01-01T13:54:03</date>
            </transacGrp>
            <transacGrp>
               <transac type="change">DF</transac>
               <date>2008-08-01T13:54:03</date>
            </transacGrp>
         </termGrp>
      </languageGrp>
      </languageGrp>
      <languageGrp>
         <language type="de" lang="EN"/>
         <termGrp>
            <term>House</term>
            <descripGrp>
               <descrip type="status">preferred</descrip>
            </descripGrp>
            <descripGrp>
               <descrip type="source">XY</descrip>
            </descripGrp>
            <transacGrp>
               <transac type="create">DF</transac>
               <date>2007-01-01T13:54:03</date>
            </transacGrp>
            <transacGrp>
               <transac type="change">DF</transac>
               <date>2008-08-01T13:54:03</date>
            </transacGrp>
         </termGrp>
      </languageGrp>
      </languageGrp>
   </conceptGrp>
   <conceptGrp>
      <concept>ABC</concept>
      <transacGrp>
         <transac type="create">User1</transac>
         <date>2003-07-14T13:05:29</date>
      </transacGrp>
      <transacGrp>
         <transac type="change">User2</transac>
         <date>2005-01-20T18:03:01</date>
      </transacGrp>
      <languageGrp>
         <language type="de" lang="DE"/>
         <termGrp>
            <term>Haus</term>
            <descripGrp>
               <descrip type="status">bevorzugt</descrip>
            </descripGrp>
            <descripGrp>
               <descrip type="source">XY</descrip>
            </descripGrp>
            <transacGrp>
               <transac type="create">DF</transac>
               <date>2007-01-01T13:54:03</date>
            </transacGrp>
            <transacGrp>
               <transac type="change">DF</transac>
               <date>2008-08-01T13:54:03</date>
            </transacGrp>
         </termGrp>
      </languageGrp>
      </languageGrp>
      <languageGrp>
         <language type="de" lang="FR"/>
         <termGrp>
            <term>Maison</term>
            <descripGrp>
               <descrip type="status">preferrer</descrip>
            </descripGrp>
            <descripGrp>
               <descrip type="source">XY</descrip>
            </descripGrp>
            <transacGrp>
               <transac type="create">DF</transac>
               <date>2007-01-01T13:54:03</date>
            </transacGrp>
            <transacGrp>
               <transac type="change">DF</transac>
               <date>2008-08-01T13:54:03</date>
            </transacGrp>
         </termGrp>
      </languageGrp>
      </languageGrp>
      <languageGrp>
         <language type="de" lang="EN"/>
         <termGrp>
            <term>House</term>
            <descripGrp>
               <descrip type="status">preferred</descrip>
            </descripGrp>
            <descripGrp>
               <descrip type="source">XY</descrip>
            </descripGrp>
            <transacGrp>
               <transac type="create">DF</transac>
               <date>2007-01-01T13:54:03</date>
            </transacGrp>
            <transacGrp>
               <transac type="change">DF</transac>
               <date>2008-08-01T13:54:03</date>
            </transacGrp>
         </termGrp>
      </languageGrp>
      </languageGrp>
   </conceptGrp>
   <conceptGrp>
      <concept>ABC</concept>
      <transacGrp>
         <transac type="create">User1</transac>
         <date>2003-07-14T13:05:29</date>
      </transacGrp>
      <transacGrp>
         <transac type="change">User2</transac>
         <date>2005-01-20T18:03:01</date>
      </transacGrp>
      <languageGrp>
         <language type="de" lang="DE"/>
         <termGrp>
            <term>Haus</term>
            <descripGrp>
               <descrip type="status">bevorzugt</descrip>
            </descripGrp>
            <descripGrp>
               <descrip type="source">XY</descrip>
            </descripGrp>
            <transacGrp>
               <transac type="create">DF</transac>
               <date>2007-01-01T13:54:03</date>
            </transacGrp>
            <transacGrp>
               <transac type="change">DF</transac>
               <date>2008-08-01T13:54:03</date>
            </transacGrp>
         </termGrp>
      </languageGrp>
      </languageGrp>
      <languageGrp>
         <language type="de" lang="FR"/>
         <termGrp>
            <term>Maison</term>
            <descripGrp>
               <descrip type="status">preferrer</descrip>
            </descripGrp>
            <descripGrp>
               <descrip type="source">XY</descrip>
            </descripGrp>
            <transacGrp>
               <transac type="create">DF</transac>
               <date>2007-01-01T13:54:03</date>
            </transacGrp>
            <transacGrp>
               <transac type="change">DF</transac>
               <date>2008-08-01T13:54:03</date>
            </transacGrp>
         </termGrp>
      </languageGrp>
      </languageGrp>
      <languageGrp>
         <language type="de" lang="EN"/>
         <termGrp>
            <term>House</term>
            <descripGrp>
               <descrip type="status">preferred</descrip>
            </descripGrp>
            <descripGrp>
               <descrip type="source">XY</descrip>
            </descripGrp>
            <transacGrp>
               <transac type="create">DF</transac>
               <date>2007-01-01T13:54:03</date>
            </transacGrp>
            <transacGrp>
               <transac type="change">DF</transac>
               <date>2008-08-01T13:54:03</date>
            </transacGrp>
         </termGrp>
      </languageGrp>
      </languageGrp>
   </conceptGrp>
   <conceptGrp>
      <concept>ABC</concept>
      <transacGrp>
         <transac type="create">User1</transac>
         <date>2003-07-14T13:05:29</date>
      </transacGrp>
      <transacGrp>
         <transac type="change">User2</transac>
         <date>2005-01-20T18:03:01</date>
      </transacGrp>
      <languageGrp>
         <language type="de" lang="DE"/>
         <termGrp>
            <term>Haus</term>
            <descripGrp>
               <descrip type="status">bevorzugt</descrip>
            </descripGrp>
            <descripGrp>
               <descrip type="source">XY</descrip>
            </descripGrp>
            <transacGrp>
               <transac type="create">DF</transac>
               <date>2007-01-01T13:54:03</date>
            </transacGrp>
            <transacGrp>
               <transac type="change">DF</transac>
               <date>2008-08-01T13:54:03</date>
            </transacGrp>
         </termGrp>
      </languageGrp>
      </languageGrp>
      <languageGrp>
         <language type="de" lang="FR"/>
         <termGrp>
            <term>Maison</term>
            <descripGrp>
               <descrip type="status">preferrer</descrip>
            </descripGrp>
            <descripGrp>
               <descrip type="source">XY</descrip>
            </descripGrp>
            <transacGrp>
               <transac type="create">DF</transac>
               <date>2007-01-01T13:54:03</date>
            </transacGrp>
            <transacGrp>
               <transac type="change">DF</transac>
               <date>2008-08-01T13:54:03</date>
            </transacGrp>
         </termGrp>
      </languageGrp>
      </languageGrp>
      <languageGrp>
         <language type="de" lang="EN"/>
         <termGrp>
            <term>House</term>
            <descripGrp>
               <descrip type="status">preferred</descrip>
            </descripGrp>
            <descripGrp>
               <descrip type="source">XY</descrip>
            </descripGrp>
            <transacGrp>
               <transac type="create">DF</transac>
               <date>2007-01-01T13:54:03</date>
            </transacGrp>
            <transacGrp>
               <transac type="change">DF</transac>
               <date>2008-08-01T13:54:03</date>
            </transacGrp>
         </termGrp>
      </languageGrp>
      </languageGrp>
   </conceptGrp>
</mtf>
Die roten Stellen würde ich gerne für eine beliebig große XML-Datei über TXMLDocument auslesen können... Kann mir da einer bitte helfen?

Vielen Dank vorab und schöne Feiertage...

sirius 30. Dez 2008 18:54

Re: Parsen mit TXMLDocument
 
Wenn du in deinem Delphi eine neue Unit erstellst mit dem XML-DataBinder, dann bastelt dir Delphi eine Klasse zusammen, mit der du ganz leicht deine XML-Datei ausliest.

Oreaden 30. Dez 2008 19:07

Re: Parsen mit TXMLDocument
 
Zitat:

Zitat von sirius
Wenn du in deinem Delphi eine neue Unit erstellst mit dem XML-DataBinder, dann bastelt dir Delphi eine Klasse zusammen, mit der du ganz leicht deine XML-Datei ausliest.

Falls das Orakel recht haben möge, gibts dieses Tool erst ab der Enterprise Version, nicht in der Professional.

Schöne Grüße
OREADEN

Namenloser 30. Dez 2008 19:09

Re: Parsen mit TXMLDocument
 
Zitat:

Zitat von Oreaden
Zitat:

Zitat von sirius
Wenn du in deinem Delphi eine neue Unit erstellst mit dem XML-DataBinder, dann bastelt dir Delphi eine Klasse zusammen, mit der du ganz leicht deine XML-Datei ausliest.

Falls das Orakel recht haben möge, gibts dieses Tool erst ab der Enterprise Version, nicht in der Professional.

Schöne Grüße
OREADEN

TurboDelphi hat es. Zur Not könnte man also das benutzen, wenn man sonst eine Professional-Version einsetzt.

rd3 2. Jan 2009 10:25

Re: Parsen mit TXMLDocument
 
Hallo,

Hier bei uns steht der DataBinder nicht zur Verfügung und TurboDelphi darf nicht installiert werden... Könnte mir einer bei Benutzung von TXMLDocument helfen...?!

Vielen Dank für Eure Hilfe

rd3 2. Jan 2009 14:45

Re: Parsen mit TXMLDocument
 
Hat evtl einer eine Lösung, die ohne TXMLDocument geht; quasi "zu Fuß" parsen?

Klaus01 2. Jan 2009 14:47

Re: Parsen mit TXMLDocument
 
Zitat:

Zitat von rd3
Hat evtl einer eine Lösung, die ohne TXMLDocument geht; quasi "zu Fuß" parsen?

Vielleicht kannst Du ja openXML einsetzen.

Was auch noch etwas für dich sein könnte ist die XMLlib von Mutze1
Grüße
Klaus

meolus 5. Jan 2009 14:14

Re: Parsen mit TXMLDocument
 
Ich benutze für XML-Dateien bisher diese (sehr) einfache Komponente: http://www.torry.net/authorsmore.php?id=4366

Das durchaus etwas sinnfreie Beispiel zum Erstellen und Laden von XML-Dateien habe ich mal so runtergeschrieben, es könnte also noch der ein oder andere Fehler drin sein, dass es nicht kompiliert!
Delphi-Quellcode:
var
  XMLDoc: TgmXML;


  //Write XML
  XMLDoc := TgmXML.Create(self);
  XMLDoc.Nodes.Clear;
  XMLDoc.Nodes.AddOpenTag('list');

  XMLDoc.Nodes.AddOpenTag('item');
  XMLDoc.Nodes.AddLeaf('name').AsString := 'Maier';
  XMLDoc.Nodes.AddLeaf('plz').AsInteger := 12345;
  XMLDoc.Nodes.AddLeaf('ort').AsString := 'Musterhausen';
  XMLDoc.Nodes.AddCloseTag;

  XMLDoc.Nodes.AddOpenTag('item');
  XMLDoc.Nodes.AddLeaf('name').AsString := 'Müller';
  XMLDoc.Nodes.AddLeaf('plz').AsInteger := 2345;
  XMLDoc.Nodes.AddLeaf('ort').AsString := 'Entenbach';
  XMLDoc.Nodes.AddCloseTag;

  XMLDoc.Nodes.AddCloseTag;
  XMLDoc.SaveToFile('file.xml');
  XMLDoc.Free;
  //END of Write XML



  //Read XML
  var
    MyString: string;
    i: Integer;

  XMLDoc := TgmXML.Create(self);
  XMLDoc.Nodes.Clear;
  XMLDoc.LoadFromFile('file.xml');
  if XMLDoc.Nodes.NodeByName['list'] <> nil then begin
    for i := 0 to XMLDoc.Nodes.NodeByName['list'].Children.Count-1 do begin
      with XMLDoc.Nodes.NodeByName['list'].Children.Node[i] do begin
        if Children.NodeByName['name'] <> nil
        then MyString := Children.NodeByName['name'].AsString;
        if Children.NodeByName['plz'] <> nil
        then MyString := Children.NodeByName['plz'].AsInteger;
        if Children.NodeByName['ort'] <> nil
        then MyString := Children.NodeByName['ort'].AsString;
      end;
    end;
  end;
  XMLDoc.Free;
  //END of Read XML

Inhalt der Datei 'file.xml' wäre dann:
Code:
<?xml version="1.0"?>
<list>
  <item>
    <name>Maier</name>
    <plz>12345</plz>
    <ort>Musterhausen</ort>
  </item>
  <item>
    <name>Müller</name>
    <plz>2345</plz>
    <ort>Entenbach</ort>
  </item>
</list>
Ein bischen problematisch bei dieser Klasse ist das Codieren der Sonderzeichen in ihre HTML-Entsprechungen. Bin nicht mehr ganz sicher, wie das im Original war, da ich die Klasse immer entsprechend angepasst benutzt habe, aber ich meine mit der Kodierung hatte ich Probleme, weil da " in &quot; umgewandelt wurde (korrekt) aber dann nachträglich noch dieses &quot; in &amp;quot; umgewandelt wurde, was einfach nur falsch ist, aber auch von der Klasse selber nicht mehr korrekt geladen werden kann, da die Reihenfolge der Codierung beim Laden nicht zu der beim Speichern passt.

Daher die dringende Empfehlung, die AsString-Getter und -Setter in der Klasse überarbeiten, also alles raus bis auf nötige Codierung für < und >
oder halt das Codieren vervollständigen und vorallem in entsprechender Reihenfolge, dass sich da nicht solche Abhängigkeiten ergeben :D

zeras 11. Jan 2009 18:35

Re: Parsen mit TXMLDocument
 
@ meolus

Die Unit ist ganz gut, nur weiß ich nicht, wie man einen Datensatz hinten ans Ende anfügt. Hast Du da eine Idee?

meolus 11. Jan 2009 20:55

Re: Parsen mit TXMLDocument
 
Tut mir Leid zeras, das weiß ich leider auch nicht. Ich habe mal schnell durch die Klasse gescrollt aber nichts spontan direkt passendes dabei entdecken können. Sie scheint wirklich nur zum Laden und am Stück Speichern einer XML-Datei gut zu sein.

In den Projekten, wo ich die Klasse benutzt habe, hatte ich intern immer noch eine oder mehrere andere Datenstrukturen. Diese habe ich dann mit einer eigenen Funktion immer in diesem Schema mit "XMLDoc.Nodes.AddOpenTag('BlaBla'); ... XMLDoc.Nodes.AddCloseTag;" (wie im Beispiel in meinem letzten Post) an einem Stück herunter geschrieben bzw. teilweise auch erst da in diese eine XML-Struktur überführt, so dass mir das ehrlich gesagt bisher noch gar nicht aufgefallen ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz