xmldiff xupdate XMLDB xindice

XML同士の差分をとりたくて、そういうのがないかなーと探すとあんまりないっぽい。
pythonで実装された xmldiff が一番いいっぽい。MSの Using the XML Diff and Patch Tool in Your Applications もけっこういいんだけどWindowsでしか動かないので問題外。あとInriaのXyDiffもためしたけど badly out of date なようでコンパイルのしかたもわからなくて挫折しました。

xmldiff -x profile.xml profile_altered.xml

<?xml version="1.0"?>
<me>
        <name>KUMAGAI Kentaro</name>
        <mail>ku*ido.nu</mail>
        <related_url>
                <url>http://ido.nu/</url>
                <url>http://twitter.com/ku</url>
                <url>http://ku.tumblr.com/</url>
        </related_url>
</me>

<?xml version="1.0"?>
<me>
        <name>KUMAGAI Kentaro</name>
        <mail>ku0522a*gmail.com</mail>
        <related_url>
                <url>http://ido.nu/</url>
                <url>http://twitter.com/ku</url>
                <url>http://ku.tumblr.com/</url>
                <url>http://ku.tumblr.com/</url>
                <url>http://bluedot.us/users/ku0522</url>
        </related_url>
</me>

の差分をとるとxupdateという形式で

<?xml version="1.0"?>
<xupdate:modifications version="1.0" xmlns:xupdate="http://www.xmldb.org/xupdate">
<xupdate:insert-after select="/me[1]/name[1]" >  <xupdate:element name="mail">ku0522a*gmail.com
  </xupdate:element>
</xupdate:insert-after>
<xupdate:insert-after select="/me[1]/related_url[1]/url[3]" >  <xupdate:element name="url">http://ku.tumblr.com/
  </xupdate:element>
</xupdate:insert-after>
<xupdate:insert-after select="/me[1]/related_url[1]/url[4]" >  <xupdate:element name="url">http://bluedot.us/users/ku0522
  </xupdate:element>
</xupdate:insert-after>
<xupdate:remove select="/me[1]/mail[2]" />
</xupdate:modifications>

こんなのが出てくる。

これの差分を適用するコードをperlで書いたけど、書いた後でやっぱり楽した方がいいと思ってxupdateが読み込めるらしい Apache Xindice をためしてみることにした。Xindiceは”エックスインダイス”と読むと見せかけて”Zeen-Dee-Chay”と読むそうです。ジーンデーチェイ?読みやすい名前にしようよ。勝手に”ジンダイチェ”って呼んでます。

で、このxindiceはtomcatで動くって書いてあるので、tomcatがそもそもなんなのか知らないと思いつつインストール。javaのhttpdサーバなのかとおもったら servlet container って書いてあった。やっぱよくわかんない…. こういうときになにもしなくてもちゃんとJDKが入ってるのはsolarisではじめていいと思ったところです。

インストールするところは神戸大学の田村さんのデータベースシステム特論参照。自分が使ったのはxindice-1.1だったんですが、そうするとtomcatにコピーするときに

cp xindice-1.1.war $CATALINA_HOME/webapps/xindice.war

と名前を変えてコピーしておかないと後でxindiceコマンドがxindice.warみつかんないって文句を言うのでそこだけ注意。

xindice ac -c xmldb:xindice://localhost:8080/db -n AGT

でコレクションをつくって(ふつうのDBでいうテーブルみたいなもの)

xindice ad -c xmldb:xindice://localhost:8080/db/AGT -f profile.xml -n profile

でinsertする。
あとは

xindice xpath -c xmldb:xindice://localhost:8080/db/AGT -q "//a"

とかふつうにXPathでクエリ可能。

で、問題のxupdateは

xindice xupdate -c xmldb:xindice://localhost:8080/db/AGT -n profile -f diff.xml

で可能。ちゃんと適用されてtomcatで

http://localhost:8080/xindice/?/db/AGT&profile

をのぞくとちゃんと変更されてる。

これはちょっと遊べるかも、と思ったところで日本語が通らないのが発覚。UTF-8でもNGです。コードを書き換えて変換すると使えるらしいけど、javaが分かんないシロウトさんが手を出すようなものじゃないなこれは。惜しい。

でも英語しか扱わないときにはふつうに使えるわけでべんりそうです。

とおもったら Using eXist: XML Database によれば eXist は日本語もいけそうなのでためしてみます。


About this entry