- 2004-04-09 (金)
- Perl
search.cpan.org XML::Simple
↑基本的な使い方はCPANにすべて記載されてます(当たり前)。
ですので作者本人も触れていない、「日本語を含んだXML」をXML::Simpleで取り扱う際のポイントをココで紹介してみようかと思います
(仕事で使う際にbashi本人が調べて気づいた事のみになりますが)。
※文字コード「EUC-JP」または「SHIFT_JIS」の日本語を扱う場合のみ下記指摘は該当します。「UTF8」の日本語文字のみ使用している場合は問題無いように見えます。
Perl → XML
use XML::Simple; my $p = { bronze => { dragon => "shiryu", pegasus => "seiya", phoenix => "ikki" } }; my $x = new XML::Simple; my $xml = $x->XMLout($p,NoAttr=>1); print $xml; [結果] <opt> <bronze> <dragon>shiryu</dragon> <pegasus>seiya</pegasus> <phoenix>ikki</phoenix> </bronze> </opt>
というのが基本的な使い方ですが、ここでポイントとなるのが XMLout メソッドによって作成されたXML文書の冒頭部分に
<?xml version="1.0" encoding="euc-jp" ?>
↑このようなXMLヘッダタグ(正式名称なんていうの?)がついていない点です。documentを読む限り、XMLout メソッド用に「XMLヘッダタグを先頭に含ませる」オプションは存在しないようです。 まぁ、同じXML::Simpleを使ってこのXMLを取り込む分には問題なさそうですが(実際作者は "問題無い" とコメント書いてます)、「日本語を含んだXML」になると話が違ってきます。
use XML::Simple; my $p = { bronze => { dragon => "紫龍", pegasus => "星矢", phoenix => "一輝" } }; my $x = new XML::Simple; my $xml = $x->XMLout($p,NoAttr=>1); # ### $xmlの中身 ### # # <opt> # <bronze> # <dragon>紫龍</dragon> # <pegasus>星矢</pegasus> # <phoenix>一輝</phoenix> # </bronze> # </opt> # ### ↑このXMLを取り込んでみる ### my $x = new XML::Simple; my $p = $x->XMLin($xml); [結果] not well-formed (invalid token) at line 4, column 12, byte 30 at /usr/lib/perl5/site_perl/5.6.1/i386-linux/XML/Parser.pm line 187
なにが起きたかというと、
本来ならXMLヘッダタグに記述されている「文字コード」指定が存在しないので、
→XMLin メソッドからコールされる XML::Parser がすべての文字をデフォルト文字コードの「UTF8」として解釈しようする
→予期しない「EUC-JP」「SHIFT_JIS」の文字を読み取ろうとする
→エラー
というわけです(あくまでもbashi想像 /w)。
ですので(後にXMLin等でPERLに取り込む予定の)日本語を含んだXMLを作成する場合は、自分でXMLヘッダタグをつけておく必要があります。
use XML::Simple my $p = { bronze => { dragon => "紫龍", pegasus => "星矢", phoenix => "一輝" } }; my $encoding = "euc-jp"; # or "Shift_JIS"; my $x = new XML::Simple; my $xml = $x->XMLout($p,NoAttr=>1); my $head = qq(<?xml version="1.0" encoding="${encoding}" ?>\n); $xml = $head . $xml; print $xml; [結果] <?xml version="1.0" encoding="euc-jp" ?> <opt> <bronze> <dragon>紫龍</dragon> <pegasus>星矢</pegasus> <phoenix>一輝</phoenix> </bronze> </opt>
これでバッチリ。XML::Simple でもXML::Parser でもガンガン取り込めます。
しかし無事XMLinを用いてXML文書をPerl構造体に変換できた後も1点注意すべきポイントがあります。
... 長くなってきたので続きは次のエントリで。
次回: ■XML → Perl
関連情報
XML::Simple は遅い説における意外な落とし穴
XML::Simple は遅い説における意外な落とし穴 - おまけ編
- Newer: Motley Crue の Vince Neil
- Older: XML::Parser と encoding指定について