![]() |
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:
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?
<?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> Vielen Dank vorab und schöne Feiertage... |
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.
|
Re: Parsen mit TXMLDocument
Zitat:
Schöne Grüße OREADEN |
Re: Parsen mit TXMLDocument
Zitat:
|
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 |
Re: Parsen mit TXMLDocument
Hat evtl einer eine Lösung, die ohne TXMLDocument geht; quasi "zu Fuß" parsen?
|
Re: Parsen mit TXMLDocument
|
Re: Parsen mit TXMLDocument
Ich benutze für XML-Dateien bisher diese (sehr) einfache Komponente:
![]() 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:
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 " umgewandelt wurde (korrekt) aber dann nachträglich noch dieses " in &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.
<?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> 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 |
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? |
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