これは Perl の XML::DOM パッケージの使い方をまとめたものです。
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(文書ノード)と出力されます。
<paper/>と、開始タグと終了タグの2つが組になった、
<paper>...</paper>です。 上のプログラムで、
<paper/>の部分を、
<paper>text</paper>と書き換えても、このXML文書には、子ノードはタグが一つだけで、 その名前はpaperです。 プログラムの実行結果は、同じです。
Perl XML::DOM独自の toString メソッドでノード全体を文字列で出力できます。 プログラムの最後に、
print $doc->toString;を付け加えると、XML文書全体が出力されます。
<paper color="white"></paper>このようにタグが属性を持つとき、その属性値を次のようにして取得できます。
print $node->getAttribute ('color'), "\n"; ### white
次のプログラムは、 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_NODEgetNodeNameでは#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)で得られます。
my $nodes = $doc->getElementsByTagName ("CODEBASE");