Utilisation des noeuds XML

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation des composants XML


Quand un document XML a été analysé par une implémentation de DOM, les données qu'il représente sont accessibles via une hiérarchie de noeuds. Chaque noeud correspond à un élément balisé du document. Par exemple, étant donné le code XML suivant :

<?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 génère la hiérarchie de noeuds suivante : la racine de la hiérarchie est le noeud StockHoldings. StockHoldings contient deux noeuds enfant qui correspondent aux deux balises Stock. Chacun de ces noeuds enfant a lui-même quatre noeuds enfant (name, price, symbol et shares). Ces quatre noeuds enfant sont des noeuds feuille, ou noeuds terminaux. Le texte qu'ils contiennent apparaît comme valeur de chaque noeud feuille.

Remarque :  Cette division en noeuds peut varier selon la manière dont l'implémentation de DOM génère les noeuds pour un document XML. En particulier, un analyseur DOM traite tous les éléments balisés comme des noeuds internes. Des noeuds supplémentaires (de type noeud texte) sont créés pour les valeurs des noeuds name, price, symbol et shares. Ces noeuds texte apparaissent alors comme des enfants des noeuds name, price, symbol et shares.

Pour accéder à chaque nœud, utilisez une interface Xml.XMLIntf.IXMLNode, en partant du nœud racine, qui soit la valeur de la propriété DocumentElement du composant document XML.

Utilisation de la valeur d'un noeud

Etant donné une interface IXMLNode, vous pouvez vérifier si elle représente un noeud interne ou un noeud feuille en testant la valeur de la propriété IsTextElement.

  • Si elle représente un noeud feuille, vous pouvez lire ou écrire sa valeur en utilisant la propriété Text.
  • Si elle représente un noeud interne, vous pouvez accéder à ses noeuds enfant en utilisant la propriété ChildNodes.

Ainsi, par exemple, en utilisant le document XML précédent, vous pouvez lire la valeur de l'action Borland de la manière suivante :

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;

Utilisation des attributs d'un noeud

Si le noeud possède des attributs, vous pouvez les manipuler en utilisant la propriété Attributes. Vous pouvez lire ou écrire la valeur des attributs en spécifiant un nom d'attribut existant. Vous pouvez ajouter de nouveaux attributs en spécifiant le nom du nouvel attribut lorsque vous initialisez la propriété Attributes :

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

Ajout et suppression de noeuds enfant

Vous pouvez ajouter des noeuds enfant en utilisant la méthode AddChild. AddChild crée de nouveaux noeuds correspondant aux éléments balisés du document XML. De tels noeuds sont appelées noeuds éléments.

Pour créer un nouveau noeud élément, spécifiez le nom qui doit apparaître dans la nouvelle balise et éventuellement la position à laquelle le nouveau noeud doit apparaître. Par exemple, le code suivant ajoute une nouvelle cotation au document précédent :

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

Une version redéfinie de AddChild vous permet de spécifier l'URI d'espace de nommage dans lequel le nom de balise est défini.

Vous pouvez supprimer des noeuds enfant en utilisant les méthodes de la propriété ChildNodes. ChildNodes est une interface IXMLNodeList qui gère les enfants d'un noeud. Vous pouvez utiliser sa méthode Delete pour supprimer un noeud enfant unique identifié par sa position ou par son nom. Par exemple, le code suivant supprime la dernière cotation énumérée dans le document précédent :

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

Voir aussi