use XML::RSS::LibXML;
my $rss = XML::RSS::LibXML->new;
$rss->parse_file('rss.xml');
print $rss->as_string();
これは前からできたけど、今度はちゃんとRSSを作れるぜ!
my $rss = XML::RSS::LibXML->new(version => '1.0');
$rss->channel(
title => "RSS title",
link => 'http://example.com'
);
... その他いろいろ ...
$rss->save("foo.xml");
一応RSS 1.0ならかなりの制度で $rss2->parse($rss1->as_string) して、$rss1 == $rss2のようにできるはず!
今回一番手こずったのはXMLネームスペース。結果的に作成したいRSSはこういうふうに始まってほしい:
<rdf:RDF</pp>
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://purl.org/rss/1.0/"
.... other declaration ...
>
最初は
$xml = XML::LibXML::Document->new('1.0', 'UTF-8');
$root = $xml->createElementNS($RDF_NS, 'RDF');
$root->setNamespace($RDF_NS, 'rdf', 1);
$root->setNamespace($DEFAULT_NS. '', 1);
ってやってたんだが、これをやるとxmlns:rdfとxmlns(default)が同じになってしまう。いろいろ試してみてようやくたどり着いたのが
$xml = XML::LibXML::Document->new('1.0', 'UTF-8');
$root = $xml->createElementNS($DEFAULT_NS, 'RDF');
$root->setNamespace($RDF_NS, 'rdf', 1);
なるほど、createElementNS()はXMLノードのデフォルトネームスペースを設定するAPIだったのね・・・。昨日の夜から今朝にかけて2時間半はたっぷり悩みました。とほほ。