たけまる / 2007-03
2007-03-31 Sat
_ Atom 0.3 と 1.0 の相互変換 [atom][perl]



Perl で RSS や Atom を変換するには,XML::Feed や XML::FeedPP が使えます.たとえば,plagger では XML::Feed が使われています.個人的
には変換速度の速い XML::FeedPP を使っています.
[Perl] XML::FeedPP - RSS・RDF・Atomフィードの解析・生成・変換・結合
ところで,RSS や RDF と Atom を変換することはできるのですが,Atom
0.3 と 1.0 の変換はサポートしていませんでした.XML::FeedPP を Atom
1.0 に対応させるパッチを作りましたので紹介です.
FeedPP v.0.21 の Atom 1.0 対応パッチ
以下のようにして,Atom 0.3 から 1.0 に変換できます.逆も同様です.
my $atom10 = XML::FeedPP::Atom1_0->new; $feed->merge( $atom03_xml ); $feed->to_string( 'UTF-8' );
作者の川崎さんにパッチを送ったので,近いうちに取り込まれると思いま
す (モジュール名が XML::FeedPP::Atom1_0 から変更されるかもしれませ
んので注意してください).
■ 追記
XML::Feed は,Atom 0.3 から 1.0 への片道変換のみサポートしています.
XML::Feed->parse( \$atom03_xml )->convert('Atom')->as_xml;
逆変換するには,XML::Feed::Atom にハードコーディングされている
'1.0' という文字列を '0.3' にすればよいと思われます.
2007-03-29 Thu
_ Atom 0.3 と 1.0 の相異点 [atom]



Atom 0.3 と 1.0 の相異点を見やすく示したサイトがなかったので,まとめておくことにしました.下が対応表になります (XPath で書いてありま
す).空白は,対応する要素がないということです.
■ 要素・属性名の対応
| Atom0.3 | Atom1.0 |
| //tagline | //subtitle |
| //copyright | //rights |
| //generator/@url | //generator/@uri |
| //info | |
| //modified | //updated |
| //issued | //published |
| //created | |
| //link/@hreflang | |
| //link/@length | |
| //category | |
| //author/url | //author/uri |
| //content/@mode |
■ //content/@type の対応
| Atom0.3 | Atom1.0 |
| text/plain | text |
| text/html | html |
Atom 0.3 には category 要素がなかったため,Dublin Core の subject
要素で代用することが多かったようです.
詳細については以下のページが参考になります (英語ですが).
rakaz - Moving from Atom 0.3 to 1.0
2007-03-07 Wed
_ Perl - XML の処理はどれが速いかベンチ [perl][xml]



XML を多量に読み書きする予定なので,処理速度を調べてみることにしました.
パース速度については,昔の naoya さんの記事が参考になります.
Perl で XML の処理はどれが速いかベンチ : NDO::Weblog
RSS を対象としたベンチマークでは,正規表現が最速,次いで
XML::LibXML とのことです.
XML::Atom の性能を知りたかったので,同じ試験を Atom でやってみまし
た.XML::Atom は内部で XML::LibXML を使っています.
Benchmark: timing 10000 iterations of XML::Atom, XML::LibXML, XML::Simple, regexp...
XML::Atom: 4 wallclock secs ( 3.58 usr + 0.00 sys = 3.58 CPU) @ 2793.30/s (n=10000)
XML::LibXML: 2 wallclock secs ( 2.22 usr + 0.00 sys = 2.22 CPU) @ 4504.50/s (n=10000)
XML::Simple: 52 wallclock secs (51.03 usr + 0.48 sys = 51.51 CPU) @ 194.14/s (n=10000)
regexp: 0 wallclock secs ( 0.06 usr + 0.00 sys = 0.06 CPU) @ 166666.67/s (n=10000)
(warning: too few iterations for a reliable count)
テストデータには,entry をひとつだけ含むシンプルなものを使いました.
XML::Atom の速度は,XML::LibXML + overhead くらいの結果となりまし
た.保守性を考えると,XML::Atom を拡張して使うのは悪くなさそうです.
さて,出力処理は軽いので気にしなくてよいと思うのですが,念のため確
認してみました.比較対象は XML::Simple, XML::Atom, TT です.
TT: 11 wallclock secs ( 3.77 usr + 0.19 sys = 3.96 CPU) @ 2525.25/s (n=10000)
XML::Atom: 10 wallclock secs ( 9.80 usr + 0.00 sys = 9.80 CPU) @ 1020.41/s (n=10000)
XML::Simple: 6 wallclock secs ( 6.26 usr + 0.00 sys = 6.26 CPU) @ 1597.44/s (n=10000)
パースほど差はつきませんでしたが,TT がやや速い結果となりました.
TT と XML::Simple は名前空間などのオーバヘッドがないと思うので,そ
の分速いのでしょう.実装がラクなことを考えても,TT がベストの選択
肢になりそうです.
XML::Atom は,意外にもパースのが速かったりします.
以下は,ベンチマークスクリプトです.
《続きを読む》
