XML-Dokumente mit dem Datenbindungs-Experten abstrahieren

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Mit XML-Dokumenten arbeiten - Index


Es ist möglich, ein XML-Dokument allein unter Verwendung der Komponente TXMLDocument und der Schnittstelle IXMLNode zu bearbeiten, welche die Komponente für die Knoten in dem Dokument offen legt, oder sogar ausschließlich mit den DOM-Schnittstellen (unter Vermeidung von TXMLDocument) zu arbeiten. Sie können jedoch Quellcode erstellen, der wesentlich einfacher und verständlicher ist, indem Sie den XML-Datenbindungs-Experten verwenden.

Der Datenbindungs-Experte verwendet ein XML-Schema oder eine Datendatei und generiert eine Reihe von Schnittstellen, die darüber zugeordnet werden. Angenommen, es liegen folgende XML-Daten vor:

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

Der Datenbindungs-Experte generiert anhand dieser Daten die folgende Schnittstelle (zusammen mit einer Klasse, welche die Schnittstelle implementiert).

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++:

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

Jeder untergeordnete Knoten wird einer Eigenschaft zugeordnet, deren Name dem Tag-Namen des untergeordneten Knotens entspricht und dessen Wert die Schnittstelle des untergeordneten Knotens ist (falls es sich dabei um einen internen Knoten handelt) oder der Wert des untergeordneten Knotens (bei Endknoten). Jedes Knotenattribut wird ebenfalls einer Eigenschaft zugeordnet, wobei der Name der Eigenschaft der Attributname und der Wert der Eigenschaft der Attributwert ist.

Neben den Schnittstellen (und Implementierungsklassen) für jedes Tag-Element im XML-Dokument erstellt der Experte eine globale Funktion zum Abrufen der Schnittstelle zum Stammknoten. Falls das oben genannte XML-Beispiel aus einem Dokument stammt, dessen Stammknoten den Tag <Customers> hätte, würde der Datenbindungs-Experte die folgende globale Routine erstellen.

Delphi:

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

C++:

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

Die Funktion Get... verwendet die Schnittstelle als TXMLDocument-Instanz. Die Funktion Load... erstellt dynamisch eine TXMLDocument-Instanz, lädt die angegebene XML-Datei als deren Wert und gibt anschließend einen Schnittstellenzeiger zurück. Die Funktion New... erstellt eine neue (leere) TXMLDocument-Instanz und gibt die Schnittstelle an den Stammknoten zurück.

Die Verwendung der generierten Schnittstellen vereinfacht den Quellcode, da diese die Struktur des XML-Dokuments direkter widerspiegeln. Anstatt beispielsweise folgenden Quellcode zu erstellen:

Delphi:

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

C++:

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

könnten Sie diesen wie folgt formulieren:

Delphi:

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

C++:

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

Beachten Sie, dass die von Datenbindungs-Experten generierten Schnittstellen alle von IXMLNode abgeleitet sind. Dies bedeutet, dass Sie nach wie vor untergeordnete Knoten auf dieselbe Art und Weise hinzufügen können, als wenn Sie den Datenbindungs-Experten nicht verwenden würden. (Siehe auch Mit XML-Knoten arbeiten.) Wenn darüber hinaus untergeordnete Knoten sich wiederholende Elemente repräsentieren (d.h., wenn alle untergeordneten Elemente eines Knotens vom selben Typ sind), erhält der übergeordnete Knoten zwei Methoden, Add und Insert, um zusätzliche Wiederholungen hinzuzufügen. Diese Methoden sind einfacher als AddChild zu handhaben, da Sie nicht den Typ des zu erstellenden Knotens angeben müssen.

Die folgenden Themen enthalten detaillierte Informationen zur Verwendung des XML-Datenbindungs-Experten.

Siehe auch