Emacsの libXMLインタフェース

Emacs から Togetter 見れる togetter-el 書いた。 - Thanks Driven Life


これを見ていて、そういや Emacs 24から libXMLの対応が入ったとか
書いていたから XPathは使えるんじゃないかなって調べてみました。
結論から言うと使えないです。


そもそも使える関数が

  • libxml-parse-xml-region
  • libxml-parse-html-region

しかありません。


うーんって思ったんですが、結果の S式を見ていると別にいいかなとも
思えてきました。S式を使わない言語での XML処理って XPathCSS
selectorを使っても、専用の Class/メソッド使って解析って感じに
なるかと思うんですが、S式で結果が返ってくるのであれば普段使っている
関数(car, cdr系, filter系)を使って十分解析できるんじゃないかな
と思いました。見やすさの問題は多少あるかと思いますけど、わりと
コンパクトに書けるんじゃないかなという気はします。

サンプルコード(RSSの解析)

(require 'cl)
(require 'xml)

(defvar rss-url
  "http://www.dmm.co.jp/mono/dvd/-/list/=/article=actress/id=15365/rss=create/")

(defun asami-yuma:new-release ()
  (with-temp-buffer
    (let ((cmd (format "curl -s %s" rss-url)))
        (call-process-shell-command cmd nil t)
        (asami-yuma:collect-titles (libxml-parse-xml-region (point-min) (point-max))))))

(defun asami-yuma:collect-titles (xml-sexp)
  (loop for elm in (cdr xml-sexp)
        when (eq (car elm) 'item)
        do
        (princ (concat (cadr (assoc-default 'title (cdr elm))) "\n"))))

(asami-yuma:new-release)

実行結果

% emacs -Q --script amiyuma_rss.el
デビュー6周年特別記念盤 麻美ゆま200セックス20時間5枚組
極嬢ルームサービス 超VIP限定 秘密の交際クラブ 麻美ゆま
オンリー騎乗位 麻美ゆま
お漏らしが止まらない!気持ちよすぎる失禁・羞恥お漏らし200人16時間
バコバコ風俗 NO.1指名 4時間スペシャル 麻美ゆま
【アウトレットBD】犯された女教師 〜逃れられない凌辱 麻美ゆま (ブルーレイディスク)
早漏彼氏 麻美ゆま
【アウトレット】ギリモザ 美しい痴女の接吻と性交 麻美ゆま
夫の目の前で犯されて- 貞操泥棒 麻美ゆま
....

おわりに

libXML対応が入ったっていうぐらいだから、種々の API対応って
思ったんですが、そんなことはありませんでした。へたれ Lisperの私には
理解しづらいところですが、熟練 Lisperの人は XMLが S式に変換されたら
それで十分ということなんでしょう。その方が煮るなり焼くなりできて、
変に加工されてしまっているよりかはいいのかもしれません。