有一些使用 Anti-Xml 从 XML 文档中提取信息的示例,但我找不到使用 Anti-Xml 创建 XML 文档的示例。Anti-Xml 是否支持创建文档,或者我应该为此使用另一个库(哪个库?)。有没有人有使用 Anti-Xml 创建 XML 文档的示例?
2 回答
是的,您可以构建(和序列化)XML 文档:
import com.codecommit.antixml._
val doc = Elem(None, "doc", Attributes(), Map(), Group(
Elem(None, "foo", Attributes("id" -> "bar"), Map(), Group(Text("baz")))
))
val writer = new java.io.StringWriter
val serializer = new XMLSerializer("UTF-8", true)
serializer.serializeDocument(doc, writer)
您还可以使用 Anti-XML 的zippers来做一些有趣的编辑技巧:
val foos = doc \ "foo"
val newFoo = foo.head.copy(children = Group(Text("new text!")))
val newDoc = foos.updated(0, newFoo).unselect
现在newDoc
包含编辑后的文档:
scala> newDoc.toString
res1: String = <doc><foo id="bar">new text!</foo></doc>
返回的与 a 的不同之处Zipper
在于它携带有关其上下文的信息,这允许您“撤消”由 完成的选择操作。doc \ "foo"
NodeSeq
\
更新以响应ziggystar下面的评论:如果您想要 Scala 的 XML 文字之类的东西,您可以convert
在 any 上使用scala.xml.Elem
:
val test: com.codecommit.antixml.Elem = <test></test>.convert
我假设问题是关于程序化创建的。
除非您使用反 xml 的其他部分,否则我会坚持使用 Scala 的文字。但是,如果您正在寻找具有良好构建器 DSL、就地更新、XPath 使用(基于 DSL 和字符串)等的更好替代方案,那么我建议您查看 Scales。从 0.3-RC5 发布站点 (http://scala-scales.googlecode.com/svn/sites/scales/scales-xml_2.9.1/0.3-RC5/index.html):
val ns = Namespace("test:uri")
val nsa = Namespace("test:uri:attribs")
val nsp = nsa.prefixed("pre")
val builder =
ns("Elem") /@ (nsa("pre", "attr1") -> "val1",
"attr2" -> "val2",
nsp("attr3") -> "val3") /(
ns("Child"),
"Mixed Content",
ns("Child2") /( ns("Subchild") ~> "text" )
)
同样对于直接序列化,您可以利用流式传输,因为 Scales Xml 模型将模型统一用于流式传输和基于树的处理。
我在 0.3-RC6 之前还有更多文档(以及非常酷的 xml 比较框架),但我正在等待首先迁移到 sonatype。(下周预计)