ScalaでXml操作
今やXMLよりもJSONの流れですが、
それでもXML使ってるケースは多いと思います。
可読性とか色々あると思いますが、設定ファイル系は、今でもXMLが多いですね。
JavaでXMLやるとまぁメンドイですね。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件削除であれば、結合でいけそうです。