AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Parsen mit TXMLDocument

Ein Thema von rd3 · begonnen am 30. Dez 2008 · letzter Beitrag vom 11. Jan 2009
Antwort Antwort
rd3
(Gast)

n/a Beiträge
 
#1

Parsen mit TXMLDocument

  Alt 30. Dez 2008, 17:56
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...
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Parsen mit TXMLDocument

  Alt 30. Dez 2008, 19:54
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Oreaden

Registriert seit: 10. Nov 2008
60 Beiträge
 
#3

Re: Parsen mit TXMLDocument

  Alt 30. Dez 2008, 20:07
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
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Parsen mit TXMLDocument

  Alt 30. Dez 2008, 20:09
Zitat von Oreaden:
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.
  Mit Zitat antworten Zitat
rd3
(Gast)

n/a Beiträge
 
#5

Re: Parsen mit TXMLDocument

  Alt 2. Jan 2009, 11:25
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
  Mit Zitat antworten Zitat
rd3
(Gast)

n/a Beiträge
 
#6

Re: Parsen mit TXMLDocument

  Alt 2. Jan 2009, 15:45
Hat evtl einer eine Lösung, die ohne TXMLDocument geht; quasi "zu Fuß" parsen?
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Parsen mit TXMLDocument

  Alt 2. Jan 2009, 15:47
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von meolus
meolus

Registriert seit: 28. Aug 2005
Ort: Aachen
20 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Parsen mit TXMLDocument

  Alt 5. Jan 2009, 15:14
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
Real programmers don't comment their code;
if it was hard to write, it should be hard to read.
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.643 Beiträge
 
Delphi 12 Athens
 
#9

Re: Parsen mit TXMLDocument

  Alt 11. Jan 2009, 19:35
@ meolus

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

Registriert seit: 28. Aug 2005
Ort: Aachen
20 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Parsen mit TXMLDocument

  Alt 11. Jan 2009, 21:55
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.
Real programmers don't comment their code;
if it was hard to write, it should be hard to read.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz