我想看看使用http://anti-xml.org而不是Scala XML 重写bellow脚本.
这是第10章的摘录.在Scala中使用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)
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我不熟悉antixml,但是,由于没有其他答案,我会试一试
只是为了记录,你的代码返回
mayo
mustard
Run Code Online (Sandbox Code Playgroud)
更准确地说,字符串以第一个字符串的结尾和开头之间的空格/换行符开头.梅奥和芥末之间的空白是两种调味品之间的空白,芥末之后的空白是关闭之前的空白.
在antixml中,首先要做的就是转换你的,这很简单
val someAntiXml = someXML.anti
Run Code Online (Sandbox Code Playgroud)
获取调味品很容易:
var condiments = someAntiXml \ 'condiments
Run Code Online (Sandbox Code Playgroud)
然后必须提取文本.这听起来像是这样做的方式
condiments \\ text
Run Code Online (Sandbox Code Playgroud)
但是\\
不按顺序遍历结构,它看起来像广度优先遍历.因此,刚刚在调味品下面的空白在元素中位于下面一层的蛋黄酱和芥末之前.
所以这是一个可能的实现来检索文本.也许有更标准的方式,但我找不到一个.
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
Run Code Online (Sandbox Code Playgroud)
然后textOf(someAntiXml \ "condiments")
给出预期的结果.
归档时间: |
|
查看次数: |
1303 次 |
最近记录: |