我想看看使用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)
谢谢
有一些使用Anti-Xml从XML文档中提取信息的示例,但我没有找到使用Anti-Xml来创建XML文档的示例.Anti-Xml是否支持创建文档,或者我应该使用另一个库(哪一个?).有没有人有一个用Anti-Xml创建XML文档的例子?
假设我有一个XML文档存储为Anti-XML Elem:
val root : Elem =
<foo attr="val">
<bar/>
</foo>
Run Code Online (Sandbox Code Playgroud)
.我希望<baz>blahblahblah</baz>作为一个孩子附加到根元素,给予
val modified_root : Elem =
<foo attr="val">
<bar/>
<baz>blahblahblah</baz>
</foo>
Run Code Online (Sandbox Code Playgroud)
为了比较,在Python中你可以root.append(foo).
我知道我可以附加(作为兄弟姐妹)Group[Node]使用:+,但这不是我想要的:
<foo attr="val">
<bar/>
</foo>
<baz>blahblahblah</baz>
Run Code Online (Sandbox Code Playgroud)
如何将其作为最后一个孩子追加<foo>?看看文档,我没有看到明显的方法.
与Scala XML Building类似:向现有节点添加子节点,但此问题仅适用于Anti-XML而不是scala.xml.
我是从scala-user交叉发布的:
我有以下内容:
object XmlTest {
import com.codecommit.antixml._
implicit def toPicker(nodes: Group[Node]): Picker = new Picker(nodes)
class Picker(nodes: Group[Node]) {
def pick[A <: Node : ClassManifest]: Group[A] = nodes collect {
case a if implicitly[ClassManifest[A]].erasure.isInstance(a) => a.asInstanceOf[A]
}
}
def testCollect(elems: Group[Elem]) {
println("size before collect = " + elems.size)
val es = elems collect {
case e if e.name == "c" => println("element name is " + e.name); e
}
println("size after collect = " + es.size)
}
def main(args: …Run Code Online (Sandbox Code Playgroud) Anti-xml将成为Scala中的后继xml库.但我发现了一些怪癖的东西.
输入
package com.twitter.sample
import com.codecommit.antixml._
object ReadingNamespaceXml extends Application{
val xml = <tra:route xmlns:tra="trace">
<spo:id xmlnls:spo="sport">23232322</spo:id>
<tra:service ref="go" xsi:type="ref:manualService" xmlns:ref="ServiceRef"/>
</tra:route>.convert
val route = xml \ "route"
Console println route.unselect
}
Run Code Online (Sandbox Code Playgroud)
输出:
<tra:route>
<spo:id xmlnls:spo="sport">23232322</spo:id>
<tra:service xsi:type="ref:manualService" ref="go"/>
</tra:route>
Run Code Online (Sandbox Code Playgroud)
因此,输入xml和输出不一样.为什么?