XML!

週明けからログ解析をする必要があるので、ちょっとしたツールを作ってみた。
このログというのが、やっかいで、

  1. 構造化されている(1回の操作の記録が入れ子で表現されていて、それが何個も続く)
  2. ひとつの操作の記録のサイズが大体同じだが、多少、項目数の増減がある
  3. たまに半角カナが混じっている(!)
  4. 良く見ると、入れ子になった構造体の中身を表示してるだけだぞ?

という、代物で、普通にテキストでgrepと、やりづらい形になっている。
だいたいこんなイメージかな


2004/02/05 10:15:30
block1
data1 : aaaa
data2 : bbbb
block2
param_len : cccc
param_opt : dddd
パラムセット : ccdd
block3
ホゲ1 : eee
ハゲ2 : fff

2004/02/05 10:30:50
block1
data1 : vvvv
data2 : wwww
block2
param_len : xxxx
param_opt : yyyy
パラムセット : yyxx
block3
ホゲ1 : zzz
ハゲ2 : null

ある程度プログラムをかじってる人だとなんとなく構造体の形も見えてきそう?
(実際にこのログを出すプログラムを作ったのは自分ではないので断言はできないが、恐らく構造体の中身を出力してるだけだろう)
で、これを、こんな感じにxmlに変換するするツールを書いてみた。



2004/02/05 10:15:30

aaaa
bbbb


cccc
dddd
<パラムセット>ccdd


<ホゲ1>eee
<ハゲ1>fff



2004/02/05 10:30:50

vvvv
wwww


xxxx
yyyy
<パラムセット>yyxx


<ホゲ1>zzz
<ハゲ1>null



で、これを(前々から試してみたかった)XSLTを使って、適当な項目でgrepができるようにすればいいじゃなーい。
と、考えてみたのだ。
で、結論から言うと、なんとか形にはなったのだが、かなり苦戦した。

  1. xmlに整形するのは割とサックリとできた。
  2. msxml.dllで文字コードsjisを指定して、処理する場合、要素名に半角カナは絶対にダメ!

XMLとして読めてもXSLTでエラーが出て悩むことになる)

  1. DOMという一度に全部メモリに貯めてから表示を考えるやり方だったので、やたらとメモリを食う。
  2. かといってメモリをあまり食わない(らしい)SAXはいいサンプルが見つからず断念。

という感じで、メモリとCPUに任せる力任せスクリプトとなってしまった。
初めてXSLTに手を出したが、なかなか面白い。考え方が既製の言語とはずいぶん違うもんだ。



今回参考にしたところ
Studying XML for beginners
背景技術から説明してあるので、目を通すのに時間がかかるが、最初に見ておくと初歩的なミスはしなくなるかも。
たのしいXML
題材(万葉集)はともかくとして、やりたいことと、その答えが1枚にまとまっているところにセンスを感じる。