Autor Beitrag
Hagbard Celine
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: So 13.10.02 00:17 
XML hat in den letzten Jahren stark an Einfluss gewonnen.

Ich habe mich selbst damit beschäftigt um die Kommunikation zwischen verschiedenen Programmen zu verbessern.

In diesem Zusammenhang habe ich viele Vorteile von XML kennengelernt.

In dieser Diskussion werde ich meine Erfahrungen mit XML weitergeben und an ein paar Beispielen demonstrieren.

Da ich neben meinem Studium und meinem Beruf auch noch Daddy bin, kann es manchmal etwas länger dauern bis ich zum nächsten Schritt des Tutorials komme.
Ich möchte auch auf keinen Fall den Eindruck erwecken ich könne immer eine oder sogar die beste Lösung bringen. Wenn also der ein oder andere noch Erfahrungswerte einbringen kann! Bitte tu es!

Dieses Tutorial entsteht weil bisher noch keiner in diesem Forum die Möglichkeiten von XML dargestellt hat, obwohl dies mehr und mehr ihren Platz in der Softwareentwicklung verteidigt.

Ich könnte mir vorstellen das der Aufbau in etwa so sein wird :


1) Was ist XML
2) Warum XML
3) Aufbau eines XML Dokuments

4) XML und Delphi (IXMLDocument)
5) XML Dokuemente lesen und schreiben

Der Rest wird sich im Laufe dieser Diskussion wohl von alleine finden! Bitte stellt so viele Fragen wie möglich! Ist mein erstes Tutorial!
Hagbard Celine Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: Mo 14.10.02 20:34 
So,

jetzt habe ich endlich die Zeit ein wenig über XML in diesem Beitrag zu schreiben!

Meine Erfahrungen mit XML kommen in erster Linie aus der Internetprogrammerung mit PHP und aus der Client Server Programmierung. Durch diese Erfahrungen bin ich bestimmt mehr auf diese Anwendungsbereiche geeicht und wäre dankbar wenn Ihr offenstehende Fragen einfach anhängt, dann kann ich bestimmt noch die Kurve bekommen!





Was ist XML????

XML steht für Extensible Markup Language und ähnelt nicht nur vom Namen her der Sprache HTML.

XML wurde von Programmieren entwickelt um stark strukturierte Dokumente über das Web zu versenden.

Heute wird die Sprache ständig weiterentwickelt und vom W3C durch Standartds definiert.

Eine genaue Beschreibung von XML findet Ihr hier : www.w3.org/XML/


Warum XML ??????

Für XML findet mal bestimmt 1000 Argumente!
Ob XML für ein Projekt geeignet ist muss man für sich selbst herrausfinden!

Für XML spricht auf jeden Fall dass XML unabhängig von Betriebssystem und Programmierspache verwendet werden kann.
Alle wichtigen Programmiersprachen und Datenbanken haben bereits irgendeine Form der XML Unterstützung implementiert!!!

Durch die Abbildung der Daten in einer Baumstruktur können Daten einer beliebigen Form abgebildet und zwischen Prozessen ausgetauscht oder für eine spätere Weiterbehandlung gespeichert werden.

Ich werde einen Weg zeigen wie man unter Delphi mit XML Dokumenten arbeitet und wo ich XML verwende!
Hagbard Celine Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: Mo 14.10.02 20:54 
Aufbau eines XML Dokuments

Wie schon zuvor erwähnt werden die Daten in einem XML Dokument in einer Baumstrucktur gespeichert.

Jedes Dokument hat als oberstes Element einen Wurzelknoten.
Alle weiteren Inhalte werden als Child Knoten unter diesem Knoten eingefügt.

Dieses einfügen von Unterknoten wird weitergeführt bis alle Elemente unserer Datenstruktur abgebildet sind.

Bsp.:

XML Datei um ein Forum-Thema abzubilden


ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
<?xml version="1.0" encoding="iso-8859-1" ?>
<thema>
  <settings>
    <title>neues Thema im XML Forum</title>
    <startDate>1.10.2002</startDate>
    <author>Hagbard Celine</author>
  </settings>
  <content>
    <message0>
      <author>HagbardCeline</author>
      <date>1.10.2002</date>
      <message>Dieser Beitrag ist eröffnet</message>
    </message0>
    <message1>
      <author>Einer</author>
      <date>2.10.2002</date>
      <message>Das ist auch ein XML Beitrag</message>
    </message1>
    <message2>
      <author>Keiner</author>
      <date>4.10.2002</date>
      <message>Und was soll das alles?</message>
    </message2>
  </content>
</thema>


Achtung : Wegen der im deutschen Verwendeten Zeichen unbedingt encoding auf 'ISO-8859-1' setzen!!!

Einen weiteren Vorteil von XML kann man an diesem Beispiel ebenfalls sehen, um die Informationen lesen zu können braucht man weder Wissen über Datenstrukturen noch über den Aufbau von Datenbanken oder sonstigen Speichermethoden.

Moderiert von user profile iconTino: Code- durch XML-Tags ersetzt


Zuletzt bearbeitet von Hagbard Celine am So 20.10.02 13:24, insgesamt 2-mal bearbeitet
Hagbard Celine Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: Mo 14.10.02 21:10 
XML bietet neben dem einfügen von Knoten auch das definieren von Attributen / Eigenschaften.

Das Beispieldokument könnte auch so definiert werden :

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
<?xml version="1.0" ?>
<thema>
  <settings>
    <title>neues Thema im XML Forum</title>
    <startDate>1.10.2002</startDate>
    <author>Hagbard Celine</author>
  </settings>
  <content>
    <message0 author="HagbardCeline" date="1.10.2002">Dieser Beitrag ist eröffnet</message0>
    <message1 author="Einer" date="2.10.2002">Das ist auch ein XML Beitrag</message1>
    <message2 author="Keiner" date="4.10.2002">Und was soll das alles?</message2>
  </content>
</thema>


Welche Form man bei der Umsetzung seines Projektes wählt ist einem stets selbst überlassen, da sowohl die Methode mit Attributen, als auch das Verwenden von Knoten in Delphi seinen Zweck erfüllt!

Moderiert von user profile iconTino: Code- durch XML-Tags ersetzt
Hagbard Celine Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: Mo 14.10.02 21:14 
Wer selbst mehr über XML wissen will oder sich einfach nur selbst davon überzeugen möchte was XML kann, dem Empfehle ich das Buch von :

Microsoft Press
XML - Entwicklerbuch
ISBN 3-86063-636-7

Ich mache hier dann in den nächsten Tagen weiter!
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 17.10.02 23:31 
Hallo,

du hast um Fragen gebehten.
Also mich wprde nach dieser eher allgemeinen Einführung interessieren, wie ich die XML-Dateien verarbeite. Dies am liebsten mit der DELPHI XML Komponente (tXMLDocument).

Kannst du auch dazu etwas erzählen?

Neugierig
Klabautermann
Hagbard Celine Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: Fr 18.10.02 13:58 
Klabautermann hat folgendes geschrieben:
Hallo,

du hast um Fragen gebehten.
Also mich wprde nach dieser eher allgemeinen Einführung interessieren, wie ich die XML-Dateien verarbeite. Dies am liebsten mit der DELPHI XML Komponente (tXMLDocument).

Kannst du auch dazu etwas erzählen?

Neugierig
Klabautermann


Natürlich, das ware der eigendliche Sinn dieses Tutorials!

Ich bin im Moment nur leider sehr beschäftigt und komme nicht ganz so viel zu dem was ich gerne machen würde!

Diese allgemeine Einführung soll die Grundlagen bieten um jetzt weitermachen zu können!

Die Verwendung der XML Dokumente und der XMLKomponente bespreche ich direkt im nächsten posting. Versprochen!!!!
Hagbard Celine Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: So 20.10.02 13:31 
So : Jetzt fange ich endlich mal damit an wie man XML in Delphi verwenden kann.

Wie man den Beispielen entnehmen kann stellt ein XML Dokument immer eine baumstruktur da!

Wer bisher noch keine Erfahrung im Bereich OOP gesammelt hat (oder die Objektorientierten Ansätze in Delphi nicht erkannt hat!) sollte sich evtl. mit den Grundlagen in Hinsicht auf die Verwendung von Objekten vertraut machen!

Die in XML verwendete Datenstruktur findet man in sehr vielen verschiedenen Anwendungsbereichen und es lohnt sich sicher diese verstanden zu haben.

XML in Delphi

Zuerst gehen wir mal davon aus wir haben irgendein XML Dokument und wollen die Informationen aus diesem Dokument auslesen und mit diesen Arbeiten:

Das auslesen einer XML Datei wird immer von einem Parser übernommen.
Ganz Harte können sich so einen Parser natürlich auch selbst schreiben, doch im Allgemeinen sollte es ausreichen die vorhandenen Parser zu verwenden!

Der unter Windows am weitesten verbreitet Parser wird mit dem IE ausgeliefert und heisst MSXML.
Dieser Parser kann einfach über DOM angesprochen werden und steht somit auch unter Delphi zur Verfügung.

Als weitere XML Unterstützung hat Delphi die IXMLDocument Komponente eingeführt.

Ich habe Delphi 6, kann also nicht sagen ab welcher Version diese Komponente enthalten ist oder wie Ihr sie sonst bekommt! :-(

Ich verwende in meinen Beispielen die IXMLDocument Objekte, in der VCL findet Ihr noch die TXMLDocument Komponente, von der Verwendung sollte es keine großen Unterschiede geben, ich verwende die IXMLDocument Klasse da ich meist OOP verwende und hier auf visuelle Komponenten verzichten kann!

Unser erstes Programm :

Das Objekt IXMLDocument ist in der Unit XMLIntf definiert.
Die Methode newXMLDocument ist in der Unit XMLDoc definiert.
Der Parser steht in der Regel auf MSXML, kann aber auf jeden beliebigen Parser umgestellt werden.

Um in unserem ersten Beispiel ein XML-Dokument auszulesen definieren wir eine Variable vom Typ IXMLDocument und weisen dieser im onCreate Ereig. unserer Form mit der Funktion newXMLDocument ein neues leeres XML Dokument zu.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Uses XMLDoc, XMLIntf;

var myFirstXML : IXMLDocument;

procedure TForm1.FormCreate(Sender: TObject);
begin
  myFirstXML := newXMLDocument;
  end;


Jetzt haben wir zwei Möglichkeiten unserem Dokument eine XML Datei zuzuordnen :

1. Möglichkeit :

Unser Objekt IXMLDocument verfügt über die Funktionen loadFromFile, welche den Inhalt einer XML Datei ausliest.

Wir erzeugen uns also einen Button und ordnen dem onKeyPress Erg. den folgenden Code zu :

(Um die Datei forum.xml zu erhalten kopiert den Text von Beispiel 1 einfach in einen Editor und speichert diese Datei unter forum.xml! Jeder Texteditor ist geeignet!)

ausblenden Delphi-Quelltext
1:
myFirstXML.LoadFromFile('forum.xml');					


2. Möglichkeit :

Unser Objekt IXMLDokument verwaltet den Quelltext der XML Datei in einer Instanz von TStrings. Diese instanz heisst XML und kann über myFirstXML.xml gelesen und beschrieben werden!

Wir setzen eine Memo-Komp und einen zweiten Button auf unsere Form und schreiben in das onClick Erg. des Buttons folgenden Code :

(Die Memo Komp. habe ich xmlSourceMemo genannt!)

ausblenden Delphi-Quelltext
1:
myFirstXML.XML := xmlSourceMemo.Lines;					



Nachdem wir unseren Datei-Code in das XML eingelesen oder geschrieben haben müssen wir dem Parser sagen dass er das Dokument auswerten soll!

Hierzu erzeugen wir wieder einen Btn mit dem folgenden Erg.Code :

ausblenden Delphi-Quelltext
1:
myFirstXML.Active := true;					



Wenn unser XML Quelltext keine Fehler hat, so hat sich jetzt scheinbar nichts getan!
Hat es aber doch!

Der XML Parser hat das XML Dokument analysiert und eine dem Dokument entsprechende Objektstruktur im Speicher erzeugt. Auf diese Struktur kann jetzt über unser Objekt zugegriffen werden.

Welche Fehler hierbei entstehen können und warum diese auftreten sollte im Forum diskutiert werden, ich werde nicht weider darauf eingehen, da es meistens mit fehlerhaften XML Dokumenten zusammenhängt!

Wenn jetzt keine Fehler aufgetaucht ist dann haben wir unser Objekt erzeugt, ein Dokument zugeordnet und dieses durch den Parser erfolgreich ausgewertet!

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt
Hagbard Celine Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: So 20.10.02 14:44 
Ich gehe jetzt davon aus dass das zuvor erzeugte Programm vorliegt und funktioniert!!!!

Nachdem wir unser Dokument vom Parser haben auswerten lassen wollen wir die Inhalte unseres Dokuments betrachten.

Es gibt grundsätzlich zwei Möglichkeiten ein XML Dokument zu betrachten!

1. Möglichkeit :

Ich kenne die Struktur

Wenn ich die Struktur des Dokuments kenne kann ich geziehlt einzellne Knoten meines Dokuments ansprechen und diese verwenden! Ist mir die genaue Struktur nicht bekannt, so wird dies etwas aufwändiger!

Wir nehmen unser Beispiel forum.xml!

Wir wollen eine Liste mit allen Beiträgen zu einem Thema erzeugen,

der Einfachheit halber schreiben wir die Inhalte in ein Memo Feld!

Also erzeugen wir uns wieder ein Memo und einen Btn mit folgendem Erg. :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var i : Word;
begin
  xmlOutpuMemo.Lines.Clear;
  // Titelzeile anfügen
  xmlOutpuMemo.Lines.Add(myFirstXML.DocumentElement.ChildNodes['settings'].ChildNodes['title'].Text);

  // Beiträge anfügen
  for i := 0 to myFirstXML.DocumentElement.ChildNodes['content'].ChildNodes.Count -1 do
    xmlOutpuMemo.Lines.Add(myFirstXML.DocumentElement.ChildNodes['content'].ChildNodes[i].ChildNodes['message'].Text);
  end;


Da sich Diejenigen welche sich noch nicht so oft mit OOP auseinadergesetzt habe jetzt fragen werden "Was soll das" Werde ich den Aufbau kurz erleutern!

Ich habe am Anfang den Aufbau eines XML Dokuments erklärt und dabei darauf hingewiesen das jedes XML Dokument eine Baum darstellt, jeder Baum beginnt hierbei mit dem sogenannten root (Wurzel) Element.

Dieses Element sprechen wir über myFirstXML.DocumentElement an.
Diesem Element werden alle weiteren Knoten untergeordnet!!
Um unser Dokument jetzt lesbar und strukturiert zu halten hängen wir nicht alle Informationen direkt an den root an! (Das ginge zwar ist aber nur wenig sinnvol!)

Die unmittelbar untergeordneten(angehängten) Elemente eines Knotenelements können wir über die Eigenschaft ChildNodes des jeweiligen Knotens erhalten (Auch der Root ist ein Knotenelement!!!!) Der Objekttyp der Knoten ist IXMLNode!!

Wie in diesem Beispiel lassen sich diese Elemente beliebig verschachteln!

Die ersten wichtigen Eigenschaften der Knotenobjekte IXMLNode :

- text : enthält soweit vorhanden wen string welcher zwischen anfangs und endtag steht

Bsp :

<title>neues Thema im XML Forum</title> // text = "neues Thema im XML Forum"


- ChildNodes : Array mit allen direkt untergeordneten Knoten

Bsp :

myXMLNode.childNodes[0].text // Text des ersten Unterknotens
myXMLNode.childNodes['author'].text // Text des Unterknotens 'author'


// Zugegriffen wird über den Index oder den Namen des Knoten

- childNodes.count : Anzahl der untergeordneten Knoten

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt
Hagbard Celine Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: Mi 13.11.02 16:51 
Wenn die genaue Struktur des XML Dokuments nicht bekannt ist dann kann man den Baum rekursiv durchsuchen und durch Abfragen einzellner Eigenschaften oder Inhalte herrausfinden welche Inhalte die gesuchten oder verwendbaren sind.

Ein einfaches Beispiel hierfür ist die Definition einer Baumstruktur : :?

Wenn man Daten ablegen möchte welche den Inhalt einer TreeView Komponente verwaltet so ist dies mit XML sehr einfach zu realisieren.

Dieses Beispiel stellt den Inhalt eines Buches, Hilfesystem, oder ähnlichem dar und soll in einer TreeView Komponente angezeigt werden. In unserem Programm gibt es verschiedene Hilfesysteme die jeweils gewählt werden können! Also soll die Treeview Komponente dynamisch geladen werden.

die XML Datei hat folgenden Quelltext :

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
<?xml version="1.0" encoding="iso-8859-1" ?> 
<tree
  <node1 caption="XML Grundlagen">
    <node6 caption="Was ist XML?"></node6>
  <node7 caption="Warum XML?"></node7>
  <node8 caption="Von wem kommt XML?"></node8>
  </node1>   
  <node2 caption="XML einlesen"></node2>   
  <node3 caption="XML erstellen"></node3>   
  <node4 caption="XML in der Praxis"></node4>   
  <node5 caption="XML ohne Nutzen"></node5>   
</tree>


Auf unserer neuen Form plazieren wir eine TreeView Komponente und einen Button.

Der Button bekommt die Funktion strukturAuslesenBtnClick zugeteilt!

Der ganze Quelltext sieht wie folgt aus :

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
unit treeXMLSourceMainUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, XMLDoc, XMLIntf;

type
  TForm1 = class(TForm)
    TreeView: TTreeView;
    strukturAuslesenBtn: TButton;
    procedure strukturAuslesenBtnClick(Sender: TObject);
  private
    procedure recInsertNodes(rootNode: IXMLNode; Node: TTreeNode);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var myFirstXML : IXMLDocument;

procedure TForm1.recInsertNodes(rootNode: IXMLNode; Node: TTreeNode);
var i : Word;
begin
  if rootNode.ChildNodes.Count > 0 then
    for i := 0 to rootNode.ChildNodes.Count-1 do begin
      recInsertNodes(rootNode.ChildNodes[i],TreeView.Items.AddChild(Node,rootNode.ChildNodes[i].Attributes['caption']));
      end;
  end;

procedure TForm1.strukturAuslesenBtnClick(Sender: TObject);
begin
  myFirstXML := newXMLDocument;
  myFirstXML.LoadFromFile('tree.xml');
  myFirstXML.Active := true;

  treeView.Items.Clear;
  
  recInsertNodes(myFirstXML.DocumentElement,treeView.Items.AddChild(treeView.Selected,'XML Baum'));
  end;

end.


Viel Spaß beim weiterversuchen! Bis zum nächsten mal!

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconTino: Code- durch XML-Tags ersetzt
Dezipaitor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220



BeitragVerfasst: Mi 21.05.03 22:50 
gibts das auch als textdatei zum drucken?
shroty
Hält's aus hier
Beiträge: 10


D7 Pers
BeitragVerfasst: Mi 10.11.04 11:30 
werte auslesen ist ganz gut und schön, aber interessanter wird es doch bei den eigenschaften!?
hab ein bissl probiert, aber das geht irgendwie nicht so recht. wie kann man die auslesen, wenn man den eigenschafts-name kennt!?

ciao shroty
habnefrage
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 21.09.05 10:56 
Ein großes Lob von mir... ist echt eine sehr detailierte Anleitung, wenn auch schon etwas älter :)


Mal ne Frage bzgl. der Eindeutigkeit von Knoten.

ich habe folgende Struktur:
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
<sections>
  <section name="heinz">
   <bezeichner>nnn</bezeichner>
   <value>val</value>
  <section name="meins">
   <bezeichner>xxx</bezeichner>
   <value>yyy</value>
   <bezeichner>zzz</bezeichner>
   <value>vvv</value>
  </section>
</sections>

Aufmerksame Leser haben sicher bemerkt, dass es eine INI Datei nachahmt :)
Wenn ich nun ein neues Child mit AddChild('section') hinzufüge, dann kann ich später den Value "name" der Section nochmal auf Heinz setzen. Das hat zur Folge, dass ich zweimal den gleichen Namen habe, das darf aber nicht sein.

Muss ich sowas nun selbst abfangen oder gibt es fertige Klamotten mit denen man das erreicht???


mfg

Christian

Moderiert von user profile iconTino: XML-Tags hinzugefügt