トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

技術的雑談-perlのXML::DOMでXMLをいじってみる

技術的雑談-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秒)

name   comment  
URL (入力するとす ぱ むとみなします!)


技術的雑談へ戻る

TrackBack

TrackBack URL for this entry:
http://www.himajin2001.com/fswiki/tb.cgi/%B5%BB%BD%D1%C5%AA%BB%A8%C3%CC%2Dperl%A4%CEXML%3A%3ADOM%A4%C7XML%A4%F2%A4%A4%A4%B8%A4%C3%A4%C6%A4%DF%A4%EB

技術的雑談へ戻る

最終更新日時:最終更新時間:2018年05月08日 12時54分53秒
トップページに戻る