Erlang で XML 処理

ejabberd では libexpat のドライバを書いてますが、
一応標準で入っている xml 処理を使ってみます。

でも、日本語が微妙らしいです。

mitszo.xml

<iq type='set' id='session id?'>
 <query xmlns='jabber:iq:auth'>
  <username>mitszo</username>
  <password>m_i_t_s_z_o</password>
  <resource>Work</resource>
 </query>
</iq>

xmerl_sample.erl

-module(xmerl_sample).
-compile(export_all).
-include_lib("xmerl/include/xmerl.hrl").

parse(FileName) ->
    {#xmlElement{content=Iq}, _} = xmerl_scan:file(FileName),
    [{Tag, Val} ||
        #xmlElement{content=Query} <- Iq,
        #xmlElement{content=Fields} <- Query,
        #xmlText{parents=[{Tag, _} | _], value=Val} <- Fields].
> c(xmerl_sample).
> xmerl_sample:parse("mitszo.xml").
[{username,"mitszo"},
 {password,"m_i_t_s_z_o"},
 {resource,"Work"}]

内包表記で引っ張ってくるのがなんか、面白いです。
まだ Root からしか引っ張ってくる方法を覚えてません。
XPath が使えるようなので、一度パースすれば後は楽なのかな。

ちょこちょこやってみます

atom で tag 名がとれるのはいいんだけど、タグ名が日本語とかになると終わるなこれ。

#xmlAttribute とか xmerl_xpath:string とか xmerl_scan:string とか使う予定。