プロが教えるわが家の防犯対策術!

Perl の XML::LibXML モジュールを使用して XML を処理しています。

例えば、

<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<!DOCTYPE aaa PUBLIC "-//bbb//CCCC//EN" "ddd.dtd" []>
<doc>
.......
</doc>

のようなXMLに対してPerlで処理をして、
最後に
documentElement を toString して書き出しています。
しかし、この場合、DTD宣言部分を書き出すことができません。
XML::LibXMLでこの部分を取得して書き出すことはできますでしょうか。

どうぞ、よろしくお願いします。

A 回答 (1件)

PODを見ながらやってみました。


こんな感じではないでしょうか。

#!/usr/bin/env perl
use v5.16;
use warnings;
use utf8;
use open IO => qw/:utf8 :std/;
use autodie;
use XML::LibXML;

my $string = << 'EOF';
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE aaa PUBLIC "-//bbb//CCCC//EN" "ddd.dtd" []>
<doc> ....... </doc>
EOF

my $dom = XML::LibXML->load_xml(string => $string);
my $dtd = $dom->internalSubset;
say ref $dom;
say ref $dtd;
say $dtd->toString;


「XML::LibXML::Element」には、DTDを取り出すメソッドがないくさいので、もともとの「XML::LibXML::Document」オブジェクトから「XML::LibXML::Dtd」オブジェクトを引っこ抜いてくるのが楽な気がします。
結果は下記のようになりました。

XML::LibXML::Document
XML::LibXML::Dtd
<!DOCTYPE aaa PUBLIC "-//bbb//CCCC//EN" "ddd.dtd">


僕もあまり詳しいわけではありませんので、ご参考になるかどうかわかりませんが……。
    • good
    • 0
この回答へのお礼

このやり方でうまくいきました。
困っていたのでとても助かりました、ありがとうございます!

お礼日時:2012/07/30 13:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!