gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:19:40 25 4
gpt4 key购买 nike

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

谢谢

最佳答案

我不熟悉 antixml,但是,因为没有其他答案,我会尝试一下

只是为了记录,您的代码返回

  mayo
mustard

更准确地说,字符串以第一个 的结尾和开头之间的空格/换行符开头。蛋黄酱和芥末之间的空白是两种调味品之间的,芥末之后的空白是结束前的。

在 antixml 中,首先要做的似乎是转换你的,这很简单
val someAntiXml = someXML.anti

获得调味品部分很容易:
var condiments = someAntiXml \ 'condiments

然后必须提取文本。听起来这样做的方法是
condiments \\ text

但是 \\没有按顺序遍历结构,看起来像广度优先遍历。结果,刚好在调味品下的空白在元素中排在蛋黄酱和芥末之前,它们比低一级。

所以这里有一个可能的实现来检索文本。也许有更标准的方法,但我没有找到。
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")给出了预期的结果。

关于scala - xml 处理的一个例子,但使用 anti-xml 而不是 Scala xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6961646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com