ちょっと息抜き GaucheでXMLを読み込む
仕事では、XMLを扱うことが多いのです。『プログラミングGauche』を写経し始めたばかりで、まだまだへっぽこな私ですが、早速、日頃の業務に使ってみようかなぁと思っています。
そこで手習いとして、GaucheでXMLを扱った処理をいくつか書いてみます。最初は読み込みから。手元に手ごろなXMLが無いので、ricollab 郵便番号検索を使って、適当な住所を検索します。
(use rfc.http) (use sxml.ssax) ; 郵便番号534-0026を検索 (let-values (((status head body) (http-get "zip.ricollab.jp" "/5340026"))) (call-with-input-string body (cut ssax:xml->sxml <> ())))
gosh> (*TOP* (http://www.w3.org/1999/xhtml:html (|@| (xml:lang "ja")) (http://www.w3.org/1999/xhtml:head (http://www.w3.org/1999/xhtml:title "〒534-0026")) (http://www\ .w3.org/1999/xhtml:body (http://www.w3.org/1999/xhtml:h1 "〒534-0026") (http://www.w3.org/1999/xhtml:dl (http://www.w3.org/1999/xhtml:dt "番号") (http://www.w3.org/199\ 9/xhtml:dd (|@| (class "zipcode")) "5340026") (http://www.w3.org/1999/xhtml:dt "住所") (http://www.w3.org/1999/xhtml:dd (|@| (class "address")) (http://www.w3.org/1999\ /xhtml:a (|@| (href "/大阪府") (class "prefecture")) "大阪府") (http://www.w3.org/1999/xhtml:a (|@| (href "/大阪府/大阪市都島区") (class "city")) "大阪市都島区") (http\ ://www.w3.org/1999/xhtml:a (|@| (href "/大阪府/大阪市都島区/網島町") (class "town")) "網島町")) (http://www.w3.org/1999/xhtml:dt "フリガナ") (http://www.w3.org/1999/xh\ tml:dd (|@| (class "yomi")) (http://www.w3.org/1999/xhtml:a (|@| (class "prefecture")) "オオサカフ") (http://www.w3.org/1999/xhtml:a (|@| (class "city")) "オオサカシミ\ ヤコジマク") (http://www.w3.org/1999/xhtml:a (|@| (class "town")) "アミジマチョウ"))))))
検索結果が取り出せました。続いてはXMLの加工です。
解決した
手続き ssax:xml->sxml の引数で指定すればよい
(let-values (((status head body) (http-get "zip.ricollab.jp" "/5340026"))) (call-with-input-string body (cut ssax:xml->sxml <> '((xhtml . "http://www.w3.org/1999/xhtml")))))
gosh> (*TOP* (|@@| (*NAMESPACES* (xhtml "http://www.w3.org/1999/xhtml"))) (xhtml:html (|@| (xml:lang "ja")) (xhtml:head (xhtml:title "〒534-0026")) (xhtml:body (xhtml:\ h1 "〒534-0026") (xhtml:dl (xhtml:dt "番号") (xhtml:dd (|@| (class "zipcode")) "5340026") (xhtml:dt "住所") (xhtml:dd (|@| (class "address")) (xhtml:a (|@| (href "/大\\ 阪府") (class "prefecture")) "大阪府") (xhtml:a (|@| (href "/大阪府/大阪市都島区") (class "city")) "大阪市都島区") (xhtml:a (|@| (href "/大阪府/大阪市都島区/網島町") (\ class "town")) "網島町")) (xhtml:dt "フリガナ") (xhtml:dd (|@| (class "yomi")) (xhtml:a (|@| (class "prefecture")) "オオサカフ") (xhtml:a (|@| (class "city")) "オオサ\\ カシミヤコジマク") (xhtml:a (|@| (class "town")) "アミジマチョウ"))))))