Thema: Delphi Parsen mit TXMLDocument

Einzelnen Beitrag anzeigen

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