我希望看到使用http://anti-xml.org而不是Scala XML重写下面的脚本。
这是第10章的摘录。在Scala中使用Herding XML - http://ofps.oreilly.com/titles/9780596155957/HerdingXMLInScalaDSLs.html
// code-examples/XML/reading/pattern-matching-script.scala
import scala.xml._
val someXML =
<sammich>
<bread>wheat</bread>
<meat>salami</meat>
<condiments>
<condiment expired="true">mayo</condiment>
<condiment expired="false">mustard</condiment>
</condiments>
</sammich>
someXML match {
case <sammich>{ingredients @ _*}</sammich> => {
for (cond @ <condiments>{_*}</condiments> <- ingredients)
println("condiments: " + cond.text)
}
}
由于
答案 0 :(得分:6)
我不熟悉antixml,但是,由于没有其他答案,我会试一试
仅供记录,您的代码返回
mayo
mustard
更确切地说,字符串以第一个字符串的结尾和开头之间的空格/换行符开头。梅奥和芥末之间的空白是两种调味品之间的空白,芥末之后的空白是关闭之前的空白。
在antixml中,首先要做的就是转换你的,这只是
val someAntiXml = someXML.anti
获取调味品很容易:
var condiments = someAntiXml \ 'condiments
然后必须提取文本。这听起来像是这样做的方式
condiments \\ text
但是\\
没有按顺序遍历结构,它看起来像广度优先遍历。因此,只是在调味品下面的空白来自元素中的mayo和芥末,它们位于下面一层。
所以这是一个可能的实现来检索文本。也许有更标准的方式,但我找不到一个。
def textOf(g: Group[Node]) : String =
g.toList.map{
case Elem(_, _, _, _, children) => textOf(children)
case t: Text => t.text
case c: CDATA => c.text
case _ => ""
}.mkString
然后textOf(someAntiXml \ "condiments")
给出了预期的结果。