XML::DOMの使い方(草稿)

これは Perl の XML::DOM パッケージの使い方をまとめたものです。

準備

XML::ParserとXML::DOMをインストールします。

XML文書を表示

タグ名の表示

XML文書では、タグ(Tag)と呼ばれるものを使って、文書中に文書構造を書き表します。 例えば、タグは <paper/> のような形のものです。 タグにはタグ名(TagName)があり、このタグのタグ名は paper です。

次のプログラムは、XML文書

<paper/>
に対して、このXML文書中のタグ <paper/> のタグ名paperを表示します。
use XML::DOM 1.25;

my ($xml) = <<'END';
<paper/>
END

my $parser = new XML::DOM::Parser;
my $doc = $parser->parse ($xml);
my $node = $doc->getFirstChild;
print $node->getTagName, "\n"; ### paper
以下では、このプログラムを元に話を進めます。

ノード

DOMでは、XML文章を構成する部品をノード(Node)と呼びます。 ノードには、いくつかの種類があります。 ノードの種類によってはノードの中にノードを含むことができ、 それを子ノード(ChildNode)と呼びます。 XML文書自体も一つのノードです。 上のXML文書には、子ノードは一つだけあって、 それが、タグ <paper/> です。

上のプログラムでは、子ノードを getFirstChildで取得し、 そのノードのタグ名を getTagNameで取得しています。 タグではないノードに対しては、 getTagNameメソッドはつかえません。 上のプログラムの最後の行の代わりに、
print $node->getNodeName, "\n"; ### paper
としても、同じくpaperが表示されます。 また、Perl XML::DOM独自の getNodeTypeNameメソッドを使うと、 ノードの種類が文字列で得られます。 例えば、
print $node->getNodeTypeName, "\n"; ### ELEMENT_NODE
とすると、ノードの種類がELEMENT_NODE(要素ノード)と出力されます。 また、
print $doc->getNodeName, "\n";	 ### #document
print $doc->getNodeTypeName, "\n";	 ### DOCUMENT_NODE
とすると、XML文書のノードの種類がDOCUMENT_NODE(文書ノード)と出力されます。

タグの種類

タグには2種類あります。
<paper/>
と、開始タグと終了タグの2つが組になった、
<paper>...</paper>
です。 上のプログラムで、
<paper/>
の部分を、
<paper>text</paper>
と書き換えても、このXML文書には、子ノードはタグが一つだけで、 その名前はpaperです。 プログラムの実行結果は、同じです。

ノードの出力

Perl XML::DOM独自の toString メソッドでノード全体を文字列で出力できます。 プログラムの最後に、

print $doc->toString;
を付け加えると、XML文書全体が出力されます。

属性値の出力

タグには、属性を付けることができます。 下のタグには、属姓名 color に属性値 white がついています。
<paper color="white"></paper>
このようにタグが属性を持つとき、その属性値を次のようにして取得できます。
print $node->getAttribute ('color'), "\n";	### white

XMLファイルを編集

テキストノードの編集

次のプログラムは、 Perl XML::DOM独自のメソッド addText を使って、プログラム中のXML文書

<paper></paper>
<paper>text</paper>
と書き換えます。
use XML::DOM 1.25;

my ($xml) = <<'END';
<paper></paper>
END

my $parser = new XML::DOM::Parser;
my $doc = $parser->parse ($xml);
my $node = $doc->getFirstChild;
$node->addText ('text');
print $doc->toString;

元のノードpaperに、子ノードが付け加えられます。 その子ノードの種類は、テキストノード(TEXT_NODE)です。 次のプログラムを付け加えることで、確認できます。

my $text = $node->getFirstChild;
print $text->getNodeName, "\n";	 ### #text
print $text->getNodeTypeName, "\n";	 ### TEXT_NODE
getNodeNameでは#textと表示され、 getNodeTypeNameではTEXT_NODEと表示されます。

元のノードにテキストノードがあれば、そのテキストノードに文字列が追加されます。

$node->addText ('text');
$node->addText ('text');
とすると、
<paper>texttext</paper>
と表示されます。 このノードpaperの子ノードは一つです。

また、

<paper/>
の形のタグにも、子ノードが付け加えられ、結果は同じになります。

テキストノードでは、そのノードのテキスト部分を、 getNodeValueメソッドを使って取り出すことができます。

print $text->getNodeValue, "\n"; ### text

また、テキストノードでは、そのノードのテキスト部分を、 setNodeValueメソッドを使って設定できます。

$text->setNodeValue ('new text');
print $doc->toString;

ノードの新規作成

XML文書に新たにノードを追加するときは、 XML文書ノードでノードを作り、 それを他のノードの子ノードとして登録します。 ノードを作るには、ノードの種類でメソッドが異なります。 例えば、要素ノードはcreateElementで、 テキストノードはcreateTextNodeです。

子ノードの追加

次のプログラムを上のプログラムに付け加えると、 paperノードにtagNameノード(要素ノード)が付け加えられます。

my $newchild = $doc->createElement ('tagName');
$node->appendChild ($newchild);
print $doc->toString;
この状態で、$nodeには二つのノードがあります。 最初のノードは、
my $c1 = $node->getFirstChild;
で得られ、次のノードは、
my $c2 = $c1->getNextSibling;
で得られます。

子ノードの削除

子ノードの削除はremoveChildメソッドを使って、 次のように行います。

$node->removeChild ($text);
print $doc->toString;

親ノード

getParentNodeメソッドで親ノードが得られます。 setParentNodeメソッドで親ノードを設定できます。

属性の変更

次のプログラムで、 paperノードに属性(属姓名 color; 属性値 yellow)が設定されます。

$node->setAttribute ('color', 'yellow');
もとのノードに属性が無ければ、その属性が追加されます。


複数ノードの扱い

ノードリスト

getChildNodesメソッドは、 すべての子ノードをノードリストとして返すメソッドです。 ノードリストに含まれるノードの数は、 getLengthメソッドで得られます。 i 番めのノードは itemメソッドを使って、 item (i-1)で得られます。

タグ名でノードを検索

getElementsByTagNameメソッドは、 タグ名でノードを検索し、結果をノードリストで返します。
my $nodes = $doc->getElementsByTagName ("CODEBASE");

【XMLinuxホームページ】
Copyright (c) 2000 HANAI Mitsuru. All rights reserved.