Mit XML-Knoten arbeiten

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Mit XML-Komponenten arbeiten


Nachdem ein XML-Dokument von einer DOM-Implementierung ausgewertet wurde, stehen die von ihm repräsentierten Daten als Hierarchie von Knoten zur Verfügung. Jeder Knoten entspricht einem Tag-Element im Dokument. Als Ausgangspunkt diene das folgende XML-Beispiel:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE StockHoldings SYSTEM "sth.dtd">
<StockHoldings>
   <Stock exchange="NASDAQ">
      <name>Borland</name>
      <price>15.375</price>
      <symbol>BORL</symbol>
      <shares>100</shares>
   </Stock>
   <Stock exchange="NYSE">
      <name>Pfizer</name>
      <price>42.75</price>
      <symbol>PFE</symbol>
      <shares type="preferred">25</shares>
   </Stock>
</StockHoldings>

TXMLDocument würde die Hierarchie der Knoten folgendermaßen generieren: Der Stamm der Hierarchie ist der Knoten StockHoldings. StockHoldings verfügt über zwei untergeordnete Knoten, die den beiden Stock-Tags entsprechen. Jeder dieser beiden untergeordneten Knoten verfügt über vier eigene untergeordnete Knoten (name, price, symbol und shares). Diese vier Knoten fungieren als Endknoten. Der enthaltene Text erscheint als der Wert der einzelnen Endknoten.

Anmerkung:  Diese Einteilung in Knoten unterscheidet sich geringfügig von der Art und Weise, in der eine DOM-Implementierung Knoten für ein XML-Dokument generiert. Insbesondere behandelt ein DOM-Parser alle Tag-Elemente als interne Knoten. Zusätzliche Knoten (vom Typ Textknoten) werden für die Werte aller name-, price-, symbol- und shares-Knoten erstellt. Diese Textknoten erscheinen dann als die untergeordneten Knoten der Knoten name, price, symbol und shares.

Der Zugriff auf einen Knoten erfolgt über ein Xml.XMLIntf.IXMLNode-Interface, beginnend mit dem Stammknoten, bei dem es sich um den Wert der Eigenschaft DocumentElement der XML-Dokumentkomponente handelt.

Mit dem Wert eines Knotens arbeiten

Bei einem IXMLNode-Interface können Sie anhand der Eigenschaft IsTextElement prüfen, ob dieses einen internen Knoten oder einen Endknoten repräsentiert.

  • Falls dieser für einen Endknoten steht, können Sie seinen Wert mit der Eigenschaft Text lesen oder setzen.
  • Falls dieser für einen internen Knoten steht, können Sie auf ihre untergeordneten Knoten mit der Eigenschaft ChildNodes zugreifen.

Mit dem weiter oben gezeigten XML-Dokument können Sie beispielsweise den Wert der Borland-Aktie folgendermaßen lesen:

BorlandStock := XMLDocument1.DocumentElement.ChildNodes[0];
Price:= BorlandStock.ChildNodes['price'].Text;
_di_IXMLNode BorlandStock = XMLDocument1->DocumentElement->ChildNodes->GetNode(0);
AnsiString Price = BorlandStock->ChildNodes->Nodes[WideString("price")]->Text;

Mit den Attributen eines Knotens arbeiten

Falls der Knoten irgendwelche Attribute enthält, können Sie diese mithilfe der Eigenschaft Attributes bearbeiten. Sie lesen oder ändern einen Attributwert, indem Sie einen vorhandenen Attributnamen angeben. Sie können neue Attribute hinzufügen, indem Sie beim Setzen der Eigenschaft Attributes einen neuen Attributnamen angeben:

BorlandStock := XMLDocument1.DocumentElement.ChildNodes[0];
BorlandStock.ChildNodes['shares'].Attributes['type'] := 'common';
_di_IXMLNode BorlandStock = XMLDocument1->DocumentElement->ChildNodes->GetNode(0);
BorlandStock->ChildNodes->Nodes[WideString("shares")]->Attributes[WideString("type")] = "common";

Untergeordnete Knoten hinzufügen und löschen

Sie können untergeordnete Knoten mit der Methode AddChild hinzufügen. AddChild erstellt neue Knoten, die den Tag-Elementen im XML-Dokument entsprechen. Solche Knoten werden als Elementknoten bezeichnet.

Um einen neuen Elementknoten zu erstellen, geben Sie den Namen an, der im neuen Tag erscheint und optional die Position, an der der neue Knoten erscheinen soll. Der folgende Quellcode fügt beispielsweise einen neuen Aktientitel in das weiter oben gezeigte Beispieldokument ein:

var
  NewStock: IXMLNode;
  ValueNode: IXMLNode;
begin
  NewStock := XMLDocument1.DocumentElement.AddChild('stock');
  NewStock.Attributes['exchange'] := 'NASDAQ';
  ValueNode := NewStock.AddChild('name');
  ValueNode.Text := 'Cisco Systems'
  ValueNode := NewStock.AddChild('price');
  ValueNode.Text := '62,375';
  ValueNode := NewStock.AddChild('symbol');
  ValueNode.Text := 'CSCO';
  ValueNode := NewStock.AddChild('shares');
  ValueNode.Text := '25';
end;
_di_IXMLNode NewStock = XMLDocument1->DocumentElement->AddChild(WideString("stock"));
NewStock->Attributes[WideString("exchange")] = "NASDAQ";
_di_IXMLNode ValueNode = NewStock->AddChild(WideString("name"));
ValueNode->Text = WideString("Cisco Systems");
ValueNode = NewStock->AddChild(WideString("price"));
ValueNode->Text = WideString("62.375");
ValueNode = NewStock->AddChild(WideString("symbol"));
ValueNode->Text = WideString("CSCO");
ValueNode = NewStock->AddChild(WideString("shares"));
ValueNode->Text = WideString("25");

Eine überladene Version von AddChild ermöglicht Ihnen zusätzlich die Angabe des URI des Namespace, in dem der Tag-Name definiert ist.

Sie können untergeordnete Knoten mit den Methoden der Eigenschaft ChildNodes löschen. ChildNodes ist ein IXMLNodeList-Interface, welches die untergeordneten Elemente eines Knotens verwaltet. Mithilfe seiner Delete-Methode können Sie einen einzelnen untergeordneten Knoten löschen, der nach Name und Position definiert ist. Der folgende Quellcode löscht beispielsweise den letzten Aktientitel, der im zitierten Beispieldokument aufgelistet ist:

StockList := XMLDocument1.DocumentElement;
StockList.ChildNodes.Delete(StockList.ChildNodes.Count - 1);
_di_IXMLNode StockList = XMLDocument1->DocumentElement;
StockList->ChildNodes->Delete(StockList->ChildNodes->Count - 1);

Siehe auch