2012-05-02 15 views
8

hay algunos ejemplos para usar Anti-Xml para extraer información de documentos XML, pero ninguno que pude encontrar al usar Anti-Xml para crear documentos XML. ¿Anti-Xml admite la creación de documentos, o debería usar otra biblioteca para esto (cuál?). ¿Alguien tiene un ejemplo de crear un documento XML con Anti-Xml?¿Se puede usar antixml para crear documentos xml?

+1

En realidad, me hice la misma pregunta hace un tiempo, porque no estaba satisfecho con la falta de compatibilidad con el espacio de nombres con los literales XML de Scala. Así que busqué las bibliotecas alternativas para construir mi XML. Para mi caso de uso, la respuesta parece ser negativa, a juzgar por la respuesta de Travis. – ziggystar

Respuesta

5

Sí, se puede construir (y serializar) los documentos 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) 

También puede utilizar Anti-XML de hacer algunos trucos de edición interesantes:

val foos = doc \ "foo" 
val newFoo = foo.head.copy(children = Group(Text("new text!"))) 
val newDoc = foos.updated(0, newFoo).unselect 

Ahora newDoc contiene el editados documento:

scala> newDoc.toString 
res1: String = <doc><foo id="bar">new text!</foo></doc> 

El Zipper que doc \ "foo" devuelve es diferente de NodeSeq en que lleva información sobre su contexto, que le permite "deshacer" la operación de selección realizada por \.


actualización en respuesta a los comentarios ziggystar 's abajo: si quieres algo así como literales XML de Scala, sólo puede utilizar convert en cualquier scala.xml.Elem:

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

que había asumido la pregunta era acerca creación programática.

+1

Bueno, creo que la pregunta debe leerse como "¿Hay alguna manera de usar Anti-Xml para compilar documentos * de manera conveniente *?". ¿Hay algún tipo de DSL para crear documentos? Por supuesto, puede pegar manualmente las clases de implementación ... – ziggystar

+0

@ziggystar: consulte mi actualización: puede usar los literales de Scala y convertir. –

1

A menos que esté usando otras partes de anti-xml, me quedaría con los literales de Scala. Sin embargo, si está buscando una mejor alternativa con un buen DSL de generador, actualizaciones en el lugar, uso de XPath (basado en DSL y String), etc., le sugiero que consulte las Escalas. Desde el sitio de liberación 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") 
) 

También para la serialización directa puede aprovechar la transmisión, ya que el modelo Scales Xml unifica el modelo para la transmisión y el procesamiento basado en árboles.

Estoy corto antes que un 0.3-RC6 con muchos más documentos (y un marco de comparación xml muy bueno) pero estoy esperando migrar a sonatype primero. (eta la próxima semana)

+0

¿Sabes si existe una biblioteca XML que de alguna manera integre los literales XML de Scala? Creo que con macros en 2.10 esto podría ser bastante posible. – ziggystar

+0

Estaría tentado de verlo, pero actualmente soporto 2.8.x, 2.9.x y me gustaría admitir 2.10.x uniformemente. Añadir soporte macro para reutilizar los literales tendría que ser otra lib (no quiere decir que no lo haga, solo para ver si es posible). Según su comentario anterior, sin embargo, falta el soporte completo del espacio de nombres, Scales se dirige directamente a los espacios de nombres, simplemente no puede tener un nombre no calificado en ningún sitio de uso. (Sin embargo, el análisis asíncrono es el siguiente en mi lista). – Chris

Cuestiones relacionadas