Difference between revisions of "XML Tutorial/de"

From Lazarus wiki
Jump to navigationJump to search
m
Line 9: Line 9:
 
Das XML DOM (Document Object Model) ist eine Reihe standardisierter Objekte, die eine ähnliche Schnittstelle für die Benutzung von XML für verschiedene Sprachen und Systeme bieten. Der Standard spezifiziert nur die Methoden, Eigenschaften und andere Schnittstellen Teile des Objekts. Die Implementierung in verschiedenen Sprachen ist frei gelassen. Die FCL unterstützt gegenwärtig vollständig das [http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/ XML DOM 1.0].
 
Das XML DOM (Document Object Model) ist eine Reihe standardisierter Objekte, die eine ähnliche Schnittstelle für die Benutzung von XML für verschiedene Sprachen und Systeme bieten. Der Standard spezifiziert nur die Methoden, Eigenschaften und andere Schnittstellen Teile des Objekts. Die Implementierung in verschiedenen Sprachen ist frei gelassen. Die FCL unterstützt gegenwärtig vollständig das [http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/ XML DOM 1.0].
  
== Einfaches Beispiel ==
+
== Beispiele ==
  
Nehmen wir an, sie wollen auf die XML Datei 'C:\Programme\teste.xml' zugreifen. Hier ist der Inhalt der Datei:
+
Unterhalb finden sie eine Liste von XML data manipulation Beispielen mit wachsender Komplexität.
 +
 
 +
=== Lesen eines Textknotens ===
 +
 
 +
Für Delphi Programmierer:
 +
Note that when working with TXMLDocument, the text within a Node is considered a separate TEXT Node. As a result, you must access a node's text value as a separate node. For instance, consider the following XML:
  
 
<xml>
 
<xml>
  <?xml version="1.0"?>
+
  <?xml version="1.0" encoding="utf-8"?>
 +
<request>
 +
  <request_type>PUT_FILE</request_type>
 +
  <username>123</username>
 +
  <password>abc</password>
 +
</request>
 +
</xml>
 +
 
 +
The following code example shows both the correct and the incorrect ways of getting the value of the text node:
 +
 
 +
<delphi>
 +
var
 +
  PassNode: TDOMNode;
 +
  Doc:      TXMLDocument;
 +
begin
 +
  Doc := TXMLDocument.Create;
 +
  // Read in xml file from disk
 +
  ReadXMLFile(Doc, 'c:\xmlfiles\test.xml');
 +
  // Retrieve the "password" node
 +
  PassNode := Doc.DocumentElement.FindNode('password');
 +
  // Write out value of the selected node
 +
  WriteLn(PassNode.NodeValue); // wird leer sein
 +
  // The text of the node is actually a separate child node
 +
  WriteLn(PassNode.FirstChild.NodeValue); // gibt "abc" korrekt aus
 +
</delphi>
 +
 
 +
=== Ausgeben der Knotennamen ===
 +
 
 +
Das folgende Beispiel zeigt, wie man die Knotennamen in einem Memo (platziert auf einem Formular) ausgibt.
 +
 
 +
Bellow is the XML file called 'C:\Programas\teste.xml':
 +
 
 +
<xml>
 +
<?xml version="1.0" encoding="ISO-8859-1"?>
 
  <images directory="mydir">
 
  <images directory="mydir">
 
   <imageNode URL="graphic.jpg" title="">
 
   <imageNode URL="graphic.jpg" title="">
Line 23: Line 61:
 
</xml>
 
</xml>
  
Der folgende Code kann die Knotenpunkt-Namen in ein TMemo schreiben, das sich auf dem Formular befindet:
+
Und hier der Pascal Code um die Aufgabe auszuführen:
  
 
<delphi>
 
<delphi>
 
  var
 
  var
  Documento: TXMLDocument;
+
  Documento: TXMLDocument;
  i, j: Integer;
+
  i, j: Integer;
 
  begin
 
  begin
  Documento := TXMLDocument.Create;
+
  Documento := TXMLDocument.Create;
  ReadXMLFile(Documento, 'C:\Programme\teste.xml');
+
  ReadXMLFile(Documento, 'C:\Programas\teste.xml');
  Memo.Lines.Clear;
+
  Memo.Lines.Clear;
  with Documento.DocumentElement.ChildNodes do
+
  with Documento.DocumentElement.ChildNodes do
  begin
+
  begin
    for i := 0 to (Count - 1) do
+
    for i := 0 to (Count - 1) do
    begin
+
    begin
      Memo.Lines.Add(Item[i].NodeName + ' ' + Item[i].NodeValue);
+
      Memo.Lines.Add(Item[i].NodeName + ' ' + Item[i].Attributes.Item[0].NodeValue);
      for j := 0 to (Item[i].ChildNodes.Count - 1) do
+
      for j := 0 to (Item[i].ChildNodes.Count - 1) do
      begin
+
      begin
        Memo.Lines.Add(Item[i].ChildNodes.Item[j].NodeName + ' '
+
        Memo.Lines.Add(Item[i].ChildNodes.Item[j].NodeName + ' '
        + Item[i].ChildNodes.Item[j].NodeValue);
+
          + Item[i].ChildNodes.Item[j].FirstChild.NodeValue);
      end;
+
      end;
    end;
+
    end;
  end;
+
  end;
  Documento.Free;
+
  Documento.Free;
 
  end;
 
  end;
 
</delphi>
 
</delphi>
  
== Füllen eines TreeView mit XML ==
+
Dies führt zur Ausgabe von:
 +
 
 +
<pre>
 +
imageNode graphic.jpg
 +
Peca Pecacastelo.jpg1.swf
 +
Peca Pecacastelo.jpg1.swf
 +
</pre>
 +
 
 +
=== Füllen eines TreeView mit XML ===
  
 
Eine übliche Verwendung von XML Dateien ist, sie zu analysieren und ihren Inhalt in einem baumartigen Format anzuzeigen. Sie können die TTreeView Komponente auf dem "Common Controls" Tab von Lazarus finden.
 
Eine übliche Verwendung von XML Dateien ist, sie zu analysieren und ihren Inhalt in einem baumartigen Format anzuzeigen. Sie können die TTreeView Komponente auf dem "Common Controls" Tab von Lazarus finden.
Line 90: Line 136:
 
</delphi>
 
</delphi>
  
== Modifizieren eines XML Dokuments ==
+
=== Modifizieren eines XML Dokuments ===
  
 
Das wichtigste, das man sich merken muss ist, das TDOMDocument das "handle" für DOM ist. Eine Instanz dieser Klasse erhält man, indem man eine erzeugt oder indem man ein XML Dokument lädt.
 
Das wichtigste, das man sich merken muss ist, das TDOMDocument das "handle" für DOM ist. Eine Instanz dieser Klasse erhält man, indem man eine erzeugt oder indem man ein XML Dokument lädt.
Line 144: Line 190:
 
</delphi>
 
</delphi>
  
== Erzeugen eines TXMLDocument aus einem String ==
+
 
 +
=== Erzeugen eines TXMLDocument aus einem String ===
  
 
Ist eine XML Datei in MyXmlString gegeben, erzeugt der folgende Code ihre DOM:
 
Ist eine XML Datei in MyXmlString gegeben, erzeugt der folgende Code ihre DOM:
Line 159: Line 206:
 
     XML:=Nil;
 
     XML:=Nil;
 
     ReadXMLFile(XML,S); // Komplettes XML Dokument
 
     ReadXMLFile(XML,S); // Komplettes XML Dokument
     // Alternativ:
+
     // Alternatively:
 
     ReadXMLFragment(AParentNode,S); // Read only XML fragment.
 
     ReadXMLFragment(AParentNode,S); // Read only XML fragment.
 
   Finally
 
   Finally

Revision as of 11:30, 6 July 2007

Deutsch (de) English (en) español (es) français (fr) magyar (hu) Bahasa Indonesia (id) italiano (it) 日本語 (ja) 한국어 (ko) português (pt) русский (ru) 中文(中国大陆)‎ (zh_CN)

Einleitung

Die Extensible Markup Language ist eine von W3C empfohlene Sprache, die für den Informationsaustausch zwischen verschiedenen Systemen geschaffen wurde. Es ist eine textbasierte Möglichkeit, um Informationen zu speichern. Moderne Datenaustauschsprachen wie XHTML, ebenso wie die meisten WebServices Technologien, basieren auf XML.

Gegenwärtig gibt es eine Reihe von Units, die XML unter Free Pascal unterstützen. Diese Units sind "XMLRead", "XMLWrite" und "DOM" und sie sind ein Teil der Free Component Library (FCL) des Free Pascal Compilers. Die FCL ist bereits im Standard-Suchpfad für den Compiler in Lazarus. Daher müssen sie nur die Units zu ihrem uses Abschnitt hinzufügen, um die XML Unterstützung zu erhalten. Die FCL ist gegenwärtig (Oktober 2005) noch nicht dokumentiert. Daher hat dieses kurze Tutorial die Zielsetzung einen XML Einstieg unter Verwendung dieser Units zu bieten.

Das XML DOM (Document Object Model) ist eine Reihe standardisierter Objekte, die eine ähnliche Schnittstelle für die Benutzung von XML für verschiedene Sprachen und Systeme bieten. Der Standard spezifiziert nur die Methoden, Eigenschaften und andere Schnittstellen Teile des Objekts. Die Implementierung in verschiedenen Sprachen ist frei gelassen. Die FCL unterstützt gegenwärtig vollständig das XML DOM 1.0.

Beispiele

Unterhalb finden sie eine Liste von XML data manipulation Beispielen mit wachsender Komplexität.

Lesen eines Textknotens

Für Delphi Programmierer: Note that when working with TXMLDocument, the text within a Node is considered a separate TEXT Node. As a result, you must access a node's text value as a separate node. For instance, consider the following XML:

<xml>

<?xml version="1.0" encoding="utf-8"?>
<request>
  <request_type>PUT_FILE</request_type>
  <username>123</username>
  <password>abc</password>
</request>

</xml>

The following code example shows both the correct and the incorrect ways of getting the value of the text node:

<delphi>

var
 PassNode: TDOMNode;
 Doc:      TXMLDocument;
begin
 Doc := TXMLDocument.Create;
 // Read in xml file from disk
 ReadXMLFile(Doc, 'c:\xmlfiles\test.xml');
 // Retrieve the "password" node
 PassNode := Doc.DocumentElement.FindNode('password');
 // Write out value of the selected node
 WriteLn(PassNode.NodeValue); // wird leer sein
 // The text of the node is actually a separate child node
 WriteLn(PassNode.FirstChild.NodeValue); // gibt "abc" korrekt aus

</delphi>

Ausgeben der Knotennamen

Das folgende Beispiel zeigt, wie man die Knotennamen in einem Memo (platziert auf einem Formular) ausgibt.

Bellow is the XML file called 'C:\Programas\teste.xml':

<xml>

<?xml version="1.0" encoding="ISO-8859-1"?>
<images directory="mydir">
 <imageNode URL="graphic.jpg" title="">
   <Peca DestinoX="0" DestinoY="0">Pecacastelo.jpg1.swf</Peca>
   <Peca DestinoX="0" DestinoY="86">Pecacastelo.jpg2.swf</Peca>
 </imageNode>
</images>

</xml>

Und hier der Pascal Code um die Aufgabe auszuführen:

<delphi>

var
  Documento: TXMLDocument;
  i, j: Integer;
begin
  Documento := TXMLDocument.Create;
  ReadXMLFile(Documento, 'C:\Programas\teste.xml');
  Memo.Lines.Clear;
  with Documento.DocumentElement.ChildNodes do
  begin
    for i := 0 to (Count - 1) do
    begin
      Memo.Lines.Add(Item[i].NodeName + ' ' + Item[i].Attributes.Item[0].NodeValue);
      for j := 0 to (Item[i].ChildNodes.Count - 1) do
      begin
        Memo.Lines.Add(Item[i].ChildNodes.Item[j].NodeName + ' '
         + Item[i].ChildNodes.Item[j].FirstChild.NodeValue);
      end;
    end;
  end;
  Documento.Free;
end;

</delphi>

Dies führt zur Ausgabe von:

imageNode graphic.jpg
Peca Pecacastelo.jpg1.swf
Peca Pecacastelo.jpg1.swf

Füllen eines TreeView mit XML

Eine übliche Verwendung von XML Dateien ist, sie zu analysieren und ihren Inhalt in einem baumartigen Format anzuzeigen. Sie können die TTreeView Komponente auf dem "Common Controls" Tab von Lazarus finden.

Die Funktion unten nimmt ein zuvor geladenes oder im Code erzeugtes XML Dokument und füllt einen TreeView mit seinen Inhalten. Die Beschriftung von jedem Knoten ist der Inhalt des ersten Attributs eines jeden Knotens.

<delphi> procedure TForm1.XML2Tree(tree: TTreeView; XMLDoc: TXMLDocument); var

 iNode: TDOMNode;
 procedure ProcessNode(Node: TDOMNode; TreeNode: TTreeNode);
 var
   cNode: TDOMNode;
 begin
   if Node = nil then Exit; // Stops if reached a leaf
   
   // Adds a node to the tree
   TreeNode := tree.Items.AddChild(TreeNode, Node.Attributes[0].NodeValue);
   // Goes to the child node
   cNode := Node.ChildNodes.Item[0];
   // Processes all child nodes
   while cNode <> nil do
   begin
     ProcessNoDe(cNode, TreeNode);
     cNode := cNode.NextSibling;
   end;
 end;
   

begin

 iNode := XMLDoc.DocumentElement.ChildNodes.Item[0];
 while iNode <> nil do
 begin
   ProcessNode(iNode, nil); // Recursive
   iNode := iNode.NextSibling;
 end;

end; </delphi>

Modifizieren eines XML Dokuments

Das wichtigste, das man sich merken muss ist, das TDOMDocument das "handle" für DOM ist. Eine Instanz dieser Klasse erhält man, indem man eine erzeugt oder indem man ein XML Dokument lädt.

Dagegen können Knoten nicht wir normale Objekte erzeugt werden. Man muss die Methoden von TDOMDocument für die Erzeugung verwenden und sie danach mit anderen Methoden an die richtige Stelle zu bringen. Der Grund dafür ist, dass die Knoten einem speziellen Dokument auf DOM gehören müssen.

Nachfolgend sind einige gebräuchliche Methoden von TDOMDocument:

<delphi>

  function CreateElement(const tagName: DOMString): TDOMElement; virtual;
  function CreateTextNode(const data: DOMString): TDOMText;
  function CreateCDATASection(const data: DOMString): TDOMCDATASection;
    virtual;
  function CreateAttribute(const name: DOMString): TDOMAttr; virtual;

</delphi>

Und jetzt eine Beispielsmethode, die das ausgewählte Element auf einem TTreeView lokalisiert und einen Kindknoten in das entsprechende XML Dokument einfügt. Der TreeView muss vorher mit den Inhalten einer XML Datei unter Verwendung der XML2Tree Funktion gefüllt werden.

<delphi> procedure TForm1.actAddChildNode(Sender: TObject); var

 Posicao: Integer;
 NovoNo: TDomNode;

begin

 {*******************************************************************
 *  Detects the selected element
 *******************************************************************}
 if TreeView1.Selected = nil then Exit;
 if TreeView1.Selected.Level = 0 then
 begin
   Posicao := TreeView1.Selected.Index;
   NovoNo := XMLDoc.CreateElement('item');
   TDOMElement(NovoNo).SetAttribute('nome', 'Item');
   TDOMElement(NovoNo).SetAttribute('arquivo', 'Arquivo');
   XMLDoc.DocumentElement.ChildNodes.Item[Posicao].AppendChild(NovoNo);
   {*******************************************************************
   *  Updates the TreeView
   *******************************************************************}
   TreeView1.Items.Clear;
   XML2Tree(TreeView1, XMLDoc);
 end
 else if TreeView1.Selected.Level >= 1 then
 begin
   {*******************************************************************
   *  This function only works on the first level of the tree,
   *  but can easely modifyed to work for any number of levels
   *******************************************************************}
 end;

end; </delphi>


Erzeugen eines TXMLDocument aus einem String

Ist eine XML Datei in MyXmlString gegeben, erzeugt der folgende Code ihre DOM:

<delphi> Var

 S : TStringStream;
 XML : TXMLDocument;

begin

 S:= TStringStream.Create(MyXMLString);
 Try
   S.Position:=0;
   XML:=Nil;
   ReadXMLFile(XML,S); // Komplettes XML Dokument
   // Alternatively:
   ReadXMLFragment(AParentNode,S); // Read only XML fragment.
 Finally
   S.Free;
 end;

end; </delphi>

Externe Links