- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!技術的雑談-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秒)
{{comment}}
[[技術的雑談]]へ戻る
{{trackback}}
[[技術的雑談]]へ戻る