你能用antixml来创建xml文件吗?

时间:2012-05-02 20:16:00

标签: xml scala anti-xml

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

2 个答案:

答案 0 :(得分: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>

doc \ "foo"返回的ZipperNodeSeq不同,因为它包含有关其上下文的信息,这使您可以“撤消”由{{1}完成的选择操作}。


更新以回复下面ziggystar的评论:如果你想要Scala的XML文字,你可以在任何\上使用convert

scala.xml.Elem

我认为问题是关于程序化创作。

答案 1 :(得分: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。 (下周eta)