ちょっと息抜き GaucheでXMLを読み込む

仕事では、XMLを扱うことが多いのです。『プログラミングGauche』を写経し始めたばかりで、まだまだへっぽこな私ですが、早速、日頃の業務に使ってみようかなぁと思っています。

そこで手習いとして、GaucheXMLを扱った処理をいくつか書いてみます。最初は読み込みから。手元に手ごろな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の加工です。

名前空間が。。。

出力結果をよく見ると、すべての要素に名前空間URIが付与されている。。。

解決した

手続き 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")) "アミジマチョウ"))))))