Conversion de documents XML en paquets de données

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation de XML dans les applications de bases de données - Index


Après avoir créé un fichier de transformation indiquant la manière de transformer un document XML en paquet de données, vous pouvez créer des paquets de données pour tout document XML conforme au schéma utilisé dans la transformation. Ces paquets de données peuvent ensuite être affectés à un ensemble de données client et enregistrés dans un fichier pour constituer la base d'une application de base de données basée sur un fichier.

Le composant Xml.XmlTransform.TXMLTransform transforme un document XML en paquet de données selon le mappage défini dans un fichier de transformation.

Remarque :  Vous pouvez aussi utiliser TXMLTransform pour convertir un paquet de données qui apparaît au format XML en un document XML arbitraire.

Spécification du document XML source

Il existe trois méthodes pour spécifier le document XML source :

  • Si le document source est un fichier .xml sur disque, vous pouvez utiliser la propriété SourceXmlFile.
  • Si le document source est une chaîne XML en mémoire, vous pouvez utiliser la propriété SourceXml.
  • Si vous disposez d'une interface IDOMDocument pour le document source, vous pouvez utiliser la propriété SourceXmlDocument.

TXMLTransform vérifie ces propriétés dans l'ordre indiqué ci-dessus. Ainsi, elle recherche d'abord un nom de fichier dans la propriété SourceXmlFile. Si SourceXmlFile est une chaîne vide, elle vérifie la propriété SourceXml. Si SourceXml est une chaîne vide, elle vérifie alors la propriété SourceXmlDocument.

Spécification de la transformation

Il existe deux méthodes pour spécifier la transformation qui convertit le document XML en paquet de données :

  • Définissez la propriété TransformationFile pour indiquer un fichier de transformation créé à l'aide de xmlmapper.exe.
  • Définissez la propriété TransformationDocument si vous disposez d'une interface IDOMDocument pour la transformation.

TXMLTransform vérifie ces propriétés dans l'ordre indiqué ci-dessus. Ainsi, elle recherche d'abord un nom de fichier dans la propriété TransformationFile. Si TransformationFile est une chaîne vide, elle vérifie la propriété TransformationDocument.

Obtention du paquet de données résultant

Pour que TXMLTransform effectue sa transformation et génère un paquet de données, il vous suffit de lire la propriété Data. Par exemple, le code suivant utilise un document XML et un fichier de transformation pour générer un paquet de données, qui est ensuite assigné à un ensemble de données client :

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

Conversion de noeuds définis par l'utilisateur

Lorsque vous définissez une transformation à l'aide de xmlmapper.exe, vous pouvez spécifier que certains noeuds du document XML sont "définis par l'utilisateur". Les noeuds définis par l'utilisateur sont les noeuds pour lesquels vous souhaitez fournir la transformation sous forme de code plutôt qu'en vous basant sur une traduction directe d'une valeur de noeud vers une valeur de champ.

Vous pouvez fournir le code de traduction des noeuds définis par l'utilisateur en utilisant l'événement Xmlxform.OnTranslate. Le gestionnaire d'événement OnTranslate est appelé chaque fois que le composant TXMLTransform rencontre un noeud défini par l'utilisateur dans le document XML. Dans le gestionnaire d'événement OnTranslate, vous pouvez lire le document source et spécifier la valeur résultante pour le champ dans le paquet de données.

Par exemple, le gestionnaire d'événement OnTranslate suivant convertit un noeud du document XML de la forme suivante

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

en valeur de champ unique :

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);
      }
    }
  }
}

Voir aussi