プログラミング言語とXPath(6) Scala

では期待のScalaはどうでしょうか?実はScalaにできることは、おおよそ以下のようなプログラムで示されることです.

import scala.xml.XML
import scala.xml.Elem

object Main {
  def main(args: Array[String]) {
    val root = XML.loadFile("MusicLibrary.xml")
    val titles = (root \\ "musicLibrary" \ "cd").filter(cd => (cd \ "year").text =="1994" ) \ "title"
    titles.foreach(title => println("The title='" + title.text + "'"))
  }
}  

"\\"でXpathの"//"を表します."\"は"/"です.このようにdescendant::とchild::の軸を模式的に表現することができます.何故XPathのように"/"でなくて"\"なのかというと、Scalaの設計者のMartin Odeskeyさんは「Scala スケーラブルプログラミング」(インプレス)で以下のように述べています.

Scalaでは、XPathの/や//ではなく、\や\\を使っている。それはScalaでは//をコメントの先頭に使っているからである。そこで他の記号を探さなければならなかったわけだが、幸いにももう1つのスラッシュがちょうどよく使えたわけだ。」

問題はScalaではXPath式そのものは使えないということと、LINQであったような軸メソッドがこの\や\\だけであるということです.例えば.NETの時は、titleから親にさかのぼってartist要素を得るようなコードが書けましたが、Scalaではできません.

以下の質問は、DITA-OTの開発者のJarno ElovirtaさんがScalaで親の要素を求めるのにはどうしたらいいか質問しています.

How to access parent element in Scala XML

なんとScalaの標準のXMLの実装では無理なのです.

あとXPathの制約条件(predicate)にあたる部分もそこまで要素を抽出した結果にに対してfilterを使って書きます..NETのようにWhereを使って並列的に書いてゆくということはできません.

正直なところ少しがっかりしました.この点だけとればLINQの方が機能的にはるかに優れていると思います.

XPathも使えないし、軸メソッドも限定されているのではプログラムでXMLファイルの中を自由にナビゲートすることはできないからです.

実はScalaの標準のXMLの機能はWebをあたってみると結構議論されている問題のようです.なんとScalaには標準のXMLの機能をすべて削除したリリースが存在します.

XML-free Scala

ここでも紹介されているScalaXMLサポートを詳しく知るには以下のリンクが役に立ちます.

Working with Scala's XML Support

でも不便なものであれば、それを何とかしようという方はおられるようです.Scalaの標準のXMLサポート機能を置き換えるAnti-XMLや(http://anti-xml.org/)や、Scales XMLhttps://code.google.com/p/scala-scales/)の実装があります.

せっかくなのでAnti-XMLScala 2.10でビルドしようとしてみましたが、初心者ではどうにもならないビルドエラーが解決できずテストに至りませんでした.2.9でやってみた方はおられるようです.

Scales XMLは結構本格的で、XPathも使えるし、軸メソッドもつかえるようです.Git Hubから落として、Scala2.10でのビルドは成功したのですが、Scala IDE for Eclipseのバグらしきものにぶつかってしまい、これもテストできませんでした.

また機会があったら再挑戦してみたいと思います.