8

有一些使用 Anti-Xml 从 XML 文档中提取信息的示例,但我找不到使用 Anti-Xml 创建 XML 文档的示例。Anti-Xml 是否支持创建文档,或者我应该为此使用另一个库(哪个库?)。有没有人有使用 Anti-Xml 创建 XML 文档的示例?

4

2 回答 2

5

是的,您可以构建(和序列化)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

我假设问题是关于程序化创建的。

于 2012-05-02T21:01:03.930 回答
1

除非您使用反 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。(下周预计)

于 2012-05-03T18:37:43.830 回答