Scala で XML を Parse する(implicit 編)
以前、Scala で XML を Parse する(添削希望) という記事を書いたところ、ありがたい事に Scala で XML を Parse する ( DSL 編 ) - 国道十六号高架下 というトラックバックを頂いたので、喜び勇んで拝読させて頂いた。
しかし、残念ながら私のスキルでは、難しすぎてサッパリ理解できなかった。そこで、しばらく Scala 勉強会に参加するなどして修行をしてみたので、その成果を披露してみる。
import scala.io.Source import scala.xml.NodeSeq import scala.xml.parsing.XhtmlParser object Test2 { implicit def NodeSeqToNodeSeqFilter(nodes: NodeSeq): NodeSeqFilter = new NodeSeqFilter(nodes) def main(args:Array[String]) = { val source = Source.fromFile("/opt/local/share/scala-2.8/doc/scala-devel-docs/api/index.html") val xhtml = XhtmlParser(source) source.close val titles = xhtml \ "body" \\\ (("div", "id", "browser")) \\\ (("div", "id", "tpl")) \\\ (("ol", "class", "packages")) \\\ (("li", "class", "pack")) \\\ (("ol", "class", "templates"), ("ol", "class", "packages")) \\\ (("li", "title")) titles foreach println } } class NodeSeqFilter(nodes: NodeSeq) { def \\\(tags: (String, String, String)*): NodeSeq = tags.flatMap { case (name, attr, value) => (nodes \ name).filter { _.\("@" + attr).text == value } } def \\\(tags: (String, String)*): Seq[String] = tags.flatMap { case (name, attr) => (nodes \ name).map { _.\("@" + attr).text } } }
添削頂いた際に DSL というアイデアを頂いたので、\\\ というのを追加してみたものの、括弧が多くてなんだか微妙。
implicit を禁じ手にして、もう少し粘ってみよ。