Abstraction de documents XML avec l'expert Liaison de données

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation de documents XML - Index


Il est possible de manipuler un document XML en utilisant uniquement le composant TXMLDocument et l'interface IXMLNode qu'il expose pour les noeuds du document, ou même de travailler exclusivement avec les interfaces DOM (sans utiliser TXMLDocument). Néanmoins, vous pouvez écrire du code beaucoup plus simple et plus lisible en utilisant l'expert Liaison de données XML.

L'expert Liaison de données XML part d'un schéma XML ou d'un fichier de données et génère un ensemble d'interfaces correspondantes. Soit, par exemple, les données XML suivantes :

 <customer id=1>
   <name>Mark</name>
   <phone>(831) 431-1000</phone>
 </customer>

L'expert Liaison de données XML génère l'interface suivante (ainsi que la classe qui l'implémente) :

Delphi :

ICustomer = interface(IXMLNode)
       ['{8CD6A6E8-24FC-426F-9718-455F0C507C8E}']
       { Property Accessors }
       function Get_Id: Integer;
       function Get_Name: WideString;
       function Get_Phone: WideString;
       procedure Set_Id(Value: Integer);
       procedure Set_Name(Value: WideString);
       procedure Set_Phone(Value: WideString);
       { Methods & Properties }
       property Id: Integer read Get_Id write Set_Id;
       property Name: WideString read Get_Name write Set_Name;
       property Phone: WideString read Get_Phone write Set_Phone;
end;

C++0160:

__interface INTERFACE_UUID("{F3729105-3DD0-1234-80e0-22A04FE7B451}") ICustomer :
    public IXMLNode
{
public:
  virtual int __fastcall Getid(void) = 0 ;
  virtual DOMString __fastcall Getname(void) = 0 ;
  virtual DOMString __fastcall Getphone(void) = 0 ;
  virtual void __fastcall Setid(int Value)= 0 ;
  virtual void __fastcall Setname(DOMString Value)= 0 ;
  virtual void __fastcall Setphone(DOMString Value)= 0 ;
  __property int id = {read=Getid, write=Setid};
  __property DOMString name = {read=Getname, write=Setname};
  __property DOMString phone = {read=Getphone, write=Setphone};
};

Chaque noeud enfant est associé à une propriété dont le nom correspond au nom de la balise du noeud enfant et dont la valeur est l'interface du noeud enfant (si l'enfant est un noeud interne) ou la valeur du noeud enfant (pour les noeuds feuille). Chaque attribut de noeud est également associé à une propriété, le nom de la propriété étant le nom de l'attribut et sa valeur étant celle de l'attribut.

Outre la création des interfaces (et des classes d'implémentation) pour chaque élément balisé du document XML, l'expert crée des fonctions globales pour obtenir une interface sur le noeud racine. Si, par exemple, le code XML précédent provient d'un document dont le noeud racine possède la balise <Customers>, l'expert Liaison de données crée les routines globales suivantes 0160:

Delphi :

function Getcustomers(Doc: IXMLDocument): IXMLCustomerType;
function Loadcustomers(const FileName: WideString): IXMLCustomerType;
function Newcustomers: IXMLCustomerType;

C++0160:

extern PACKAGE _di_ICustomers __fastcall GetCustomers(TXMLDocument *XMLDoc);
extern PACKAGE _di_ICustomers __fastcall GetCustomers(_di_IXMLDocument XMLDoc);
extern PACKAGE _di_ICustomers __fastcall LoadCustomers(const WideString FileName);
extern PACKAGE _di_ICustomers __fastcall NewCustomers(void);

La fonction Get... utilise l'interface d'une instance de TXMLDocument. La fonction Load... crée dynamiquement une instance de TXMLDocument et charge le fichier XML spécifié comme valeur avant de renvoyer un pointeur d'interface. La fonction New... crée une instance (vide) de TXMLDocument et renvoie l'interface au noeud racine

L'utilisation des interfaces générées simplifie votre code, car celles-ci reflètent plus directement la structure du document XML. Ainsi, au lieu d'écrire du code comme suit :

Delphi :

CustIntf := XMLDocument1.DocumentElement;
CustName := CustIntf.ChildNodes[0].ChildNodes['name'].Value;

C++0160:

_di_IXMLNode CustIntf = XMLDocument1->DocumentElement;
CustName = CustIntf->ChildNodes->Nodes->GetNode(0)->ChildNodes->Nodes[WideString("name")]->Value;

Votre code serait de la forme :

Delphi :

CustIntf := GetCustomers(XMLDocument1);
CustName := CustIntf[0].Name;

C++0160:

_di_ICustomers CustIntf = GetCustomers(XMLDocument1);
CustName = CustIntf->Nodes->GetNode(0)->Name;

Remarquez que les interfaces générées par l'expert Liaison de données descendent toutes de IXMLNode. Cela signifie que vous pouvez toujours ajouter ou supprimer des noeuds enfant comme si vous n'utilisiez pas l'expert Liaison de données. Voir la section Ajout et suppression de noeuds enfant de Utilisation des noeuds XML.) De plus, quand les noeuds enfant représentent des éléments répétés (tous les enfants d'un noeud ayant le même type), le noeud parent dispose de deux méthodes, Add, et Insert, pour ajouter d'autres répétitions. Ces méthodes sont plus simples que AddChild, car il n'est pas nécessaire de spécifier le type de noeud à créer.

Les rubriques suivantes contiennent des informations détaillées sur l'utilisation de l'expert Liaison de données XML :

Voir aussi