GaucheでAtomを読み込む
最近Gaucheで作ろうと思っているプログラムで、XMLを読み込む必要があるので、その準備の意味も兼ねて適当に書いてみました。
http://d.hatena.ne.jp/myomi/20080505/1209995681 ここを参考にして書いてみました。
; Atomを読んでタイトルを表示する (use sxml.ssax) (use sxml.sxpath) (define atom "<?xml version=\"1.0\" encoding=\"utf-8\"?> <feed xmlns=\"http://www.w3.org/2005/Atom\"> <title>test</title> <link href=\"http://www.example.com/\"/> <updated>2010-02-11T09:00:00Z</updated> <author> <name>tana</name> </author> <id>test:testtesttest</id> <entry> <title>testest</title> <link href=\"http://example.org\"/> <id>test:aaaaaaaaa</id> <updated>2010-02-11T09:10:00Z</updated> <summary>test test test test test</summary> </entry> <entry> <title>aaaaaaaaaaaaaaaaaaa</title> <link href=\"http://example.com\"/> <id>test:bbbbbbbbbbb</id> <updated>2010-02-11T09:12:00Z</updated> <summary>aaaaaaaaaaaaaaaaaaaa</summary> </entry> </feed>") (define (get-title atom) (let ((sxml (ssax:xml->sxml (open-input-string atom) '((feed . "http://www.w3.org/2005/Atom"))))) (map cadr ((sxpath '(feed:feed feed:entry feed:title)) sxml)))) (define (main args) (for-each print (get-title atom)) 0)
Atomの、entryのtitle要素の内容を列挙します。
「ssax:xml->sxml」という関数でXMLの文字列をSXML(XMLをS式にしたもの)に変換しますが、「'((feed . "http://www.w3.org/2005/Atom"))」という部分で、XML名前空間を付けています。
そうすることで、「feed:entry」のような書き方を使えるようになります。
次に、「sxpath」という関数で、SXPath(XPathをS式にしたもの)を使って要素を取り出します。
sxpath関数は、関数を返すので、返ってきた関数にSXMLを渡すと要素を取り出せます。
「(map cadr」のところは、sxpathを使って要素を取り出すと、「((feed:title "title要素の中身") (feed:title "中身"))」のようになるので、それを「cadr」を使って中身だけ取り出しています。
そうして取り出したtitle要素の中身のリストを、「for-each」を使って出力しています。
今回は、かなり意味不明の文章になってしまったと思います。申し訳ございません。