XMLの名前空間接頭辞をとっぱらうGaucheスクリプト
名前空間接頭辞があるとXPathが使いづらいから消してやる。
Gaucheのsxml.tree-transライブラリを使ってSXML変換をかける。
#!/usr/bin/env gosh (use sxml.ssax) (use sxml.tools) (use sxml.serializer) (use sxml.tree-trans) (define (remove-namespace-prefix sxml) (pre-post-order sxml `((*text* . ,(lambda (trigger x) x)) (*default* . ,(lambda x (rxmatch-cond ((rxmatch #/http\:\/\/\S+\:(.*)/ (symbol->string (sxml:name x))) (#f name) (sxml:change-name x (string->symbol name))) (else x))))))) (define (main args) (define sxml (call-with-input-file (cadr args) (cut ssax:xml->sxml <> '()))) (srl:sxml->xml (remove-namespace-prefix sxml) (current-output-port)))
こんなRSSもこんなにすっきり。
<?xml version="1.0" encoding="UTF-8"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" > <channel rdf:about="http://b.hatena.ne.jp/hotentry/diary"> <title>はてなダイアリーの人気エントリー</title> <link>http://b.hatena.ne.jp/hotentry/diary</link> <description>はてなダイアリーの人気エントリー</description> <items> <rdf:Seq> <rdf:li rdf:resource="http://d.hatena.ne.jp/nitoyon/20081212/hatebu_tips" /> </rdf:Seq> </items> </channel> <item rdf:about="http://d.hatena.ne.jp/nitoyon/20081212/hatebu_tips"> <title>はてなブックマークの細かすぎて伝わりにくい新機能を勝手に紹介 - てっく煮ブログ</title> <link>http://d.hatena.ne.jp/nitoyon/20081212/hatebu_tips</link> <description>はてなブックマークがリニューアルして毎日楽しく使っているわけですが...</description> <dc:date>2008-12-12T03:55:15+09:00</dc:date> <dc:subject>はてな</dc:subject> <dc:subject>hatena</dc:subject> <dc:subject>はてブ</dc:subject> <dc:subject>はてなブックマーク</dc:subject> <dc:subject>まとめ</dc:subject> <taxo:topics> <rdf:Bag> <rdf:li resource="http://b.hatena.ne.jp/t/%E3%81%AF%E3%81%A6%E3%81%AA" /> <rdf:li resource="http://b.hatena.ne.jp/t/hatena" /> <rdf:li resource="http://b.hatena.ne.jp/t/%E3%81%AF%E3%81%A6%E3%83%96" /> <rdf:li resource="http://b.hatena.ne.jp/t/%E3%81%BE%E3%81%A8%E3%82%81" /> </rdf:Bag> </taxo:topics> </item> </rdf:RDF>
$ ./rmnspr.scm diary.rss
<?xml version="1.0" encoding="UTF-8"?> <RDF> <channel about="http://b.hatena.ne.jp/hotentry/diary"> <title>はてなダイアリーの人気エントリー</title> <link>http://b.hatena.ne.jp/hotentry/diary</link> <description>はてなダイアリーの人気エントリー</description> <items> <Seq> <li resource="http://d.hatena.ne.jp/nitoyon/20081212/hatebu_tips"/> </Seq> </items> </channel> <item about="http://d.hatena.ne.jp/nitoyon/20081212/hatebu_tips"> <title>はてなブックマークの細かすぎて伝わりにくい新機能を勝手に紹介 - てっく煮ブログ</title> <link>http://d.hatena.ne.jp/nitoyon/20081212/hatebu_tips</link> <description>はてなブックマークがリニューアルして毎日楽しく使っているわけですが...</description> <date>2008-12-12T03:55:15+09:00</date> <subject>はてな</subject> <subject>hatena</subject> <subject>はてブ</subject> <subject>はてなブックマーク</subject> <subject>まとめ</subject> <topics> <Bag> <li resource="http://b.hatena.ne.jp/t/%E3%81%AF%E3%81%A6%E3%81%AA"/> <li resource="http://b.hatena.ne.jp/t/hatena"/> <li resource="http://b.hatena.ne.jp/t/%E3%81%AF%E3%81%A6%E3%83%96"/> <li resource="http://b.hatena.ne.jp/t/%E3%81%BE%E3%81%A8%E3%82%81"/> </Bag> </topics> </item> </RDF>