XML ノードの操作

提供: RAD Studio
移動先: 案内検索

XML ドキュメントでの作業:インデックス への移動

XML ドキュメントが DOM 実装によって解析されると,そのデータをノードの階層として使用できるようになります。各ノードは,ドキュメント内のタグ付き要素に対応します。たとえば,次の XML があるとします。



 <?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 が生成するノードの階層は次のようになります。階層のルートは StockHoldings ノードになります。StockHoldings には 2 つの子ノードがあり,これが 2 つの Stock タグに対応します。この 2 つの子ノードのそれぞれには,独自に 4 つの子ノード(namepricesymbolshares)があります。この 4 つの子ノードは,リーフノードとして機能します。これらに含まれるテキストは,各リーフノードの値として表示されます。

メモ:  このノード分割は,DOM 実装が XML ドキュメントのノードを生成する方法とは少し異なります。特に,DOM パーサーがすべてのタグ付き要素を内部ノードとして扱う点が異なります。(テキスト型のノードの)追加ノードが,namepricesymbolshares ノードの値に対して作成されます。そして,これらのテキストノードは,namepricesymbolshares ノードの子として表示されます。

各ノードは,XML ドキュメントコンポーネントの DocumentElement プロパティの値であるルートノードを出発点として,Xml.XMLIntf.IXMLNode インターフェースによってアクセスされます。

ノードの値の操作

IXMLNode インターフェースがある場合,IsTextElement プロパティをチェックすることで,このインターフェースが内部ノードまたはリーフノードのどちらを表すかをチェックできます。

  • リーフノードを表す場合は,Text プロパティを使って値の読み出しまたは設定ができます。
  • 内部ノードを表す場合は,ChildNodes プロパティを使って子ノードにアクセスできます。

したがって,たとえば上記の XML ドキュメントを使用すると,次のようにして Borland の株価を読み出すことができます。



 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;



ノードの属性の操作

ノードに属性が含まれる場合は,Attributes プロパティを使用してこの属性を操作できます。既存の属性名を指定すると,属性の値の読み出しまたは変更ができます。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";



子ノードの追加と削除

AddChild メソッドを使用すると,子ノードを追加できます。AddChild は,XML ドキュメント内のタグ付き要素に対応する新しいノードを作成します。このようなノードは,要素ノードと呼ばれます。

新しい要素ノードを作成するには,新しいタグに表示される名前を指定し,必要であれば,新しいノードが表示される場所を指定します。たとえば,次のコードは,上記のドキュメントに新しい株式リストを追加します。



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



オーバーロードバージョンの AddChild を使用すると,タグ名が定義される名前空間 URI を指定できます。

ChildNodes プロパティのメソッドを使用すると,子ノードを削除できます。ChildNodesIXMLNodeList インターフェースの 1 つであり,ノードの子を管理します。このプロパティの Delete メソッドを使用すると,位置または名前で識別される 1 つの子ノードを削除できます。たとえば,次のコードは,上記のドキュメントにリストされた最後の株式を削除します。



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



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



関連項目