XML-Dokumente in Datenpakete konvertieren

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu XML in Datenbankanwendungen verwenden - Index


Nachdem Sie die Transformationsdatei erstellt haben, mit der angegeben wird, wie ein XML-Dokument in ein Datenpaket konvertiert wird, können Sie für beliebige XML-Dokumente, die dem in der Transformation zu verwendenden Schema entsprechen Datenpakete erstellen. Diese Datenpakete können dann einer Client-Datenmenge zugewiesen und in einer Datei gespeichert werden, sodass sie als Grundlage für eine dateigestützte Datenbankanwendung dienen können.

Mit der Komponente Xml.XmlTransform.TXMLTransform lässt sich ein XML-Dokument entsprechend den Zuordnungen in der Transformationsdatei in ein Datenpaket transformieren.

Hinweis: Mit TXMLTransform können Sie auch ein im XML-Format vorliegendes Datenpaket in ein beliebiges XML-Dokument konvertieren.

Das XML-Quelldokument angeben

Zur Angabe des XML-Quelldokuments haben Sie drei Möglichkeiten:

  • Wenn es sich beim Quelldokument um eine auf der Festplatte gespeicherte .XML- Datei handelt, können Sie die Eigenschaft SourceXmlFile verwenden.
  • Wenn es sich um einen im Arbeitsspeicher befindlichen XML-String handelt, können Sie die Eigenschaft SourceXml verwenden.
  • Wenn für das Quelldokument eine IDOMDocument-Schnittstelle zur Verfügung steht, können Sie die Eigenschaft SourceXmlDocument verwenden.

TXMLTransform überprüft diese Eigenschaften in der oben angegebenen Reihenfolge. Zunächst wird also nach einem Dateinamen in der Eigenschaft SourceXmlFile gesucht. Nur wenn diese einen leeren String enthält, wird die Eigenschaft SourceXml überprüft. Und nur wenn diese ebenfalls einen leeren String enthält, wird die Eigenschaft SourceXmlDocument überprüft.

Transformationsdatei bzw. -schnittstelle angeben

Es gibt zwei Möglichkeiten, um die Transformationsdatei bzw. -schnittstelle anzugeben, mit der ein XML-Dokument in ein Datenpaket konvertiert wird:

  • Setzen Sie die Eigenschaft TransformationFile, um anzugeben, dass eine mit xmlmapper.exe erstellte Transformationsdatei verwendet werden soll.
  • Setzen Sie die Eigenschaft TransformationDocument, wenn für die Transformation eine IDOMDocument-Schnittstelle verwendet werden soll.

TXMLTransform überprüft diese Eigenschaften in der oben angegebenen Reihenfolge. Zunächst wird also nach einem Dateinamen in der Eigenschaft TransformationFile gesucht. Nur wenn diese Eigenschaft einen leeren String enthält, wird die Eigenschaft TransformationDocument überprüft.

Das entstehende Datenpaket abrufen

Damit TXMLTransform die Transformation durchführt und ein Datenpaket generiert, brauchen Sie nur die Eigenschaft Data zu lesen. Im folgenden Quellcode werden ein XML-Dokument und eine Transformationsdatei verwendet, um ein Datenpaket zu generieren, das anschließend einer Client-Datenmenge zugewiesen wird:

 XMLTransform1.SourceXMLFile := 'CustomerDocument.xml';
 XMLTransform1.TransformationFile := 'CustXMLToCustTable.xtr';
 ClientDataSet1.XMLData := XMLTransform1.Data;
 XMLTransform1->SourceXMLFile = "CustomerDocument.xml";
 XMLTransform1->TransformationFile = "CustXMLToCustTable.xtr";
 ClientDataSet1->XMLData = XMLTransform1->Data;

Benutzerdefinierte Knoten konvertieren

Beim Definieren einer Transformation mit xmlmapper.exe lässt sich für bestimmte Knoten im XML-Dokument angeben, dass diese benutzerdefiniert sind. Eine solche Kennzeichnung verweist darauf, dass Sie die Transformation im Quellcode angeben und nicht die einfache Umsetzung von Knotenwerten in Feldwerte verwenden möchten.

Den Quelltext zur Konvertierung benutzerdefinierter Knoten geben Sie über das Ereignis Xml.XmlTransform.TXMLTransform.OnTranslate an. Die OnTranslate-Ereignisbehandlungsroutine wird jedes Mal aufgerufen, wenn die Komponente TXMLTransform in einem XML-Dokument einen benutzerdefinierten Knoten findet. In der Ereignisbehandlungsroutine für OnTranslate können Sie das Quelldokument lesen und den für das Feld im Datenpaket zu verwendenden Wert angeben.

Die folgende OnTranslate-Ereignisbehandlungsroutine konvertiert einen Knoten in einem XML-Dokument mit der Form

<FullName>
   <Title> </Title>
   <FirstName> </FirstName>
   <LastName> </LastName>
</FullName>

in einen einzigen Feldwert:

 procedure TForm1.XMLTransform1Translate(Sender: TObject; Id: String; SrcNode: IDOMNode;
   var Value: String; DestNode: IDOMNode);
 var
   CurNode: IDOMNode;
 begin
   if Id = 'FullName' then
   begin
     Value = '';
     if SrcNode.hasChildNodes then
     begin
       CurNode := SrcNode.firstChild;
       Value := Value + CurNode.nodeValue;
       while CurNode <> SrcNode.lastChild do
       begin
         CurNode := CurNode.nextSibling;
         Value := Value + ' ';
         Value := Value + CurNode.nodeValue;
       end;
     end;
   end;
 end;
 void __fastcall TForm1::XMLTransform1Translate(TObject *Sender, AnsiString Id,
 _di_IDOMNode SrcNode, AnsiString &Value, _di_IDOMNode DestNode)
 {
   if (Id == "FullName")
   {
     Value = "";
     if (SrcNode.hasChildNodes)
     {
       _di_IXMLDOMNode CurNode = SrcNode.firstChild;
       Value = SrcValue + AnsiString(CurNode.nodeValue);
       while (CurNode != SrcNode.lastChild)
       {
         CurNode = CurNode.nextSibling;
         Value = Value + AnsiString(" ");
         Value = Value + AnsiString(CurNode.nodeValue);
       }
     }
   }
 }

Siehe auch