有一些使用Anti-Xml从XML文档中提取信息的示例,但我没有找到使用Anti-Xml创建XML文档的示例。 Anti-Xml是否支持创建文档,或者我应该使用另一个库(哪一个?)。有没有人有一个使用Anti-Xml创建XML文档的例子?
答案 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"
返回的Zipper
与NodeSeq
不同,因为它包含有关其上下文的信息,这使您可以“撤消”由{{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)