ScalaでXml操作

今やXMLよりもJSONの流れですが、
それでもXML使ってるケースは多いと思います。

可読性とか色々あると思いますが、設定ファイル系は、今でもXMLが多いですね。

JavaXMLやるとまぁメンドイですね。dom4jとか使っても
ActionScriptとかのXML操作に慣れてると、面倒だと感じずにはいられません。
そこでScala
Scalaには、標準でXML操作が簡単に出来るらしい。
まず、読込。
APIこちらhttp://www.scala-lang.org/api/current/scala/xml/XML$.html

var xml:Elem = XML.load(path)

これで読込出来ます。

・属性値からの探索
 ASだと、xml..item(@att=value)な感じでサクっととれますが、
 さすがにここまで出来ません。たぶん・・・。
 属性値からの探索ってあんまりしないんでしょうね。ネットにもサンプルの少ないです。
 Scala - Language - Matching XML elements with a specific value for an attribute
 とかでやり方あったんですが、この通りでは、出来ませんでした。

def attributeEquals(name: String, value: String)(node: Node) = 
			node.attribute(name).filter(_.text==value).isDefined

val result = (xml \\ "item").filter(XmlSearch.attributeEquals("att",value))

filterで、text比較しないとNilになります。

ここでXMLの置換を実装してみたのですが、デバッグ見てると、置換する回数がおかしい。
http://devneko.net/blog/tag/scala
少ないXMLなら、そこまで問題にならないと思うけど、まぁマズイです。
BaseTransformer · Issue #4528 · scala/bug · GitHub
修正もまだされてないっぽい。

自前でRewriteRuleを実装するほどの度胸はなく
また、Elementもrootのchildだけ置換でよかったりするので、Listで扱う事にしました。
list.findIndexOf
list.updated
list.drop
とか使いました。削除に関しては、可変コレクション使いたくなりますけど、

val oldIndex = list.findIndexOf(_.value=="hoge")
if (oldIndex==(-1)) {
    return list
}
val result = list.take(oldIndex):::list.drop(oldIndex+1)

1件削除であれば、結合でいけそうです。