トップ 一覧 検索 ヘルプ 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秒)
{{comment}}

[[技術的雑談]]へ戻る

{{trackback}}

[[技術的雑談]]へ戻る