技術的雑談-perlのXML::DOMでXMLをいじってみる
環境
- 使用OS:CentOS 3.5
- perl:5.8.0 (CentOS 3.5の標準)
- XML::DOM:1.27
目的
- perl XML::DOMを使ってみる
- XML文章のObject化
- XML Elementの追加
- XML Attributeの追加
- XML Fileの出力、文字列の取得
手順
初期化
- XML::DOMをuseする。
- XML::DOM::Parserをコンストラクトする。
- XML File、又はXML Fileの中身の文字列をParserに食わせる
- XML::DOM::Document Objectが返ってくる
サンプル1
use strict; # XML::DOMの使用宣言 use XML::DOM; # 解析元になるXMLデータの作成 my $xml = <<EOF; <?xml version="1.0" encoding="euc-jp"?> <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.3b2/DocBook-XSL 1.67/docbookx.dtd" > <article></article> EOF # XMLを解析してDOM Objectを作成する my $parser = new XML::DOM::Parser; # Parserの作成 my $doc = $parser->parse ($xml); # ParserにXMLを食わせる my $rootnode = $doc->getDocumentElement; # XMLのRoot Nodeを取得 # XMLの内容を標準出力に表示 print "\n\n******** XML Output ********\n"; print $doc->toString;
実行結果1
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.3b2/DocBook-XSL 1.67/docbookx.dtd"> <article/>
Elementを追加
まず、cleateElement()でElementを作成し、それを親Nodeにつなげる。
サンプル2
use strict; # XML::DOMの使用宣言 use XML::DOM; # 解析元になるXMLデータの作成 my $xml = <<EOF; <?xml version="1.0" encoding="euc-jp"?> <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.3b2/DocBook-XSL 1.67/docbookx.dtd" > <article></article> EOF # XMLを解析してDOM Objectを作成する my $parser = new XML::DOM::Parser; # Parserの作成 my $doc = $parser->parse ($xml); # ParserにXMLを食わせる my $rootnode = $doc->getDocumentElement; # XMLのRoot Nodeを取得 # 新しいNode(Element)の作成 my $newnode = $doc->createElement ('articleinfo'); # 親Node(Element)の子としてつなげる $rootnode->appendChild ($newnode); # XMLの内容を標準出力に表示 print "\n\n******** XML Output ********\n"; print $doc->toString;
実行結果2
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.3b2/DocBook-XSL 1.67/docbookx.dtd"> <article><articleinfo/></article>
ElementにAttributeをつける
ElementのsetAttribute()メソッドを使う
サンプル3
use strict; # XML::DOMの使用宣言 use XML::DOM; # 解析元になるXMLデータの作成 my $xml = <<EOF; <?xml version="1.0" encoding="euc-jp"?> <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.3b2/DocBook-XSL 1.67/docbookx.dtd" > <article></article> EOF # XMLを解析してDOM Objectを作成する my $parser = new XML::DOM::Parser; # Parserの作成 my $doc = $parser->parse ($xml); # ParserにXMLを食わせる my $rootnode = $doc->getDocumentElement; # XMLのRoot Nodeを取得 # 新しいNode(Element)の作成 my $newnode = $doc->createElement ('articleinfo'); # Attributeを設定する $newnode->setAttribute('id', 'hogehoge'); # 親Node(Element)の子としてつなげる $rootnode->appendChild ($newnode); # XMLの内容を標準出力に表示 print "\n\n******** XML Output ********\n"; print $doc->toString;
実行結果3
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.3b2/DocBook-XSL 1.67/docbookx.dtd"> <article><articleinfo id="hogehoge"/></article>
ElementのTextを設定する
ElementのsetNodeValue()メソッドを使う。
サンプル4
use strict; # XML::DOMの使用宣言 use XML::DOM; # 解析元になるXMLデータの作成 my $xml = <<EOF; <?xml version="1.0" encoding="euc-jp"?> <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.3b2/DocBook-XSL 1.67/docbookx.dtd" > <article></article> EOF # XMLを解析してDOM Objectを作成する my $parser = new XML::DOM::Parser; # Parserの作成 my $doc = $parser->parse ($xml); # ParserにXMLを食わせる my $rootnode = $doc->getDocumentElement; # XMLのRoot Nodeを取得 # 新しいNode(Element)の作成 my $newnode = $doc->createElement ('articleinfo'); # Attributeを設定する $newnode->setAttribute('id', 'hogehoge'); # 親Node(Element)の子としてつなげる $rootnode->appendChild ($newnode); # 新しいNodeを作り、その中にTextを設定する my $para = $doc->createElement ('para'); $para->addText('fugafuga'); $rootnode->appendChild($para); # XMLの内容を標準出力に表示 print "\n\n******** XML Output ********\n"; print $doc->toString;
実行結果4
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.3b2/DocBook-XSL 1.67/docbookx.dtd"> <article><articleinfo id="hogehoge"/><para>fugafuga</para></article>
TODO
- Nodeの取得方法を調べる(getParentNode()、getChildNodes()?)
履歴
2007/3/28 -- 初版
技術的雑談へ戻る
突っ込み
- サンプルコードの「# XML::DOMの仕様宣言」は使用宣言だと思われます。 - 通りすがり (2018年04月29日 06時03分10秒)
- ありがとうございます。修正しました。 - Tsubasa (2018年05月08日 12時54分53秒)