2012-05-02 43 views
8

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

+1

实际上,前段时间我问自己同样的问题,因为我对Scala XML文字缺乏名称空间支持感到不满意。所以我寻找了替代库来构建我的XML。对于我的使用案例来说,答案似乎是消极的,由特拉维斯的答案来判断。 – ziggystar

回答

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) 

您还可以使用反XML的做一些有趣的编辑技巧:

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> 

Zipperdoc \ "foo"返回与NodeSeq不同,因为它携带有关其上下文的信息,这允许您“撤消”\完成的选择操作。


更新响应下面ziggystar的评论是:如果你想要像Scala的XML文本,你可以在任何scala.xml.Elem使用convert

val test: com.codecommit.antixml.Elem = <test></test>.convert 

我会承担的问题是关于程序化创作。

+1

嗯,我认为这个问题应该被解读为“有没有一种方法可以用方便的方式使用Anti-Xml来构建文档*?”。像是有什么DSL创建文件?当然你可以手动粘贴实现类... – ziggystar

+0

@ziggystar:看我的更新 - 你可以使用Scala的文字和转换。 –

1

除非您使用其他部分的反xml,否则我会坚持使用Scala的文字。但是,如果你正在寻找一个更好的选择,有一个漂亮的构建器DSL,就地更新,XPath使用(基于DSL和String)等,那么我建议看看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)

+0

您是否知道是否存在某种集成了Scala的XML文字的XML库?我认为在2.10中使用宏可能会变得很有可能。 – ziggystar

+0

我很想看看它,但我目前支持2.8.x和2.9.x,我希望统一支持2.10.x。添加宏支持重新使用文字将不得不是另一个库(并不意味着我不会这样做,只是为了看看它是否可能)。 根据上面的评论,缺乏完整的名称空间支持,缩​​放目标直接命名空间,你不能在任何使用网站有一个非限定名称。 (然而,我的列表中接下来是异步分析)。 – Chris