xml处理的一个例子,但使用anti-xml而不是Scala xml

时间:2011-08-05 19:31:15

标签: scala anti-xml

我希望看到使用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)
    }
}

由于

1 个答案:

答案 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")给出了预期的结果。