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 つの子ノード(name,price,symbol,shares)があります。この 4 つの子ノードは,リーフノードとして機能します。これらに含まれるテキストは,各リーフノードの値として表示されます。
メモ: このノード分割は,DOM 実装が XML ドキュメントのノードを生成する方法とは少し異なります。特に,DOM パーサーがすべてのタグ付き要素を内部ノードとして扱う点が異なります。(テキスト型のノードの)追加ノードが,name,price,symbol,shares ノードの値に対して作成されます。そして,これらのテキストノードは,name,price,symbol,shares ノードの子として表示されます。
各ノードは,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 プロパティのメソッドを使用すると,子ノードを削除できます。ChildNodes は IXMLNodeList インターフェースの 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);