2012-05-02 8 views
8

ci sono alcuni esempi per l'utilizzo di Anti-Xml per estrarre informazioni da documenti XML, ma non ho trovato nulla che utilizzi Anti-Xml per creare documenti XML. Anti-Xml supporta la creazione di documenti o dovrei usare un'altra libreria per questo (quale?). Qualcuno ha un esempio di creazione di un documento XML con Anti-Xml?È possibile utilizzare antixml per creare documenti xml?

+1

In realtà, mi sono fatto la stessa domanda qualche tempo fa, perché ero insoddisfatto della mancanza di supporto per i namespace con i letterali di Scala XML. Così ho cercato le librerie alternative per costruire il mio XML. Per il mio caso d'uso, la risposta sembra essere negativa, a giudicare dalla risposta di Travis. – ziggystar

risposta

5

Sì, è possibile costruire (e serializzare) documenti 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) 

È inoltre possibile utilizzare Anti-XML di di fare alcune interessanti trucchi di editing:

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

Ora newDoc contiene il modificati documento:

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

Il Zipper che i ritorni doc \ "foo" siano diversi da uno NodeSeq in quanto contiene informazioni sul relativo contesto, che consente di "annullare" l'operazione di selezione effettuata da \.


Aggiornamento in risposta al commento ziggystar s' di seguito: se vuoi qualcosa di simile letterali XML di Scala, si può semplicemente utilizzare convert su qualsiasi scala.xml.Elem:

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

avevo assunto la questione era di circa creazione programmatica.

+1

Bene, penso che la domanda dovrebbe essere letta come "C'è un modo per usare Anti-Xml per costruire documenti * in modo conveniente *?". C'è una specie di DSL per la creazione di documenti? Ovviamente puoi incollare manualmente insieme le classi di implementazione ... – ziggystar

+0

@ziggystar: guarda il mio aggiornamento: puoi semplicemente usare i valori letterali di Scala e convertire. –

1

A meno che non si stiano utilizzando altre parti di anti-xml, mi attenersi ai valori letterali di Scala. Tuttavia, se stai cercando un'alternativa migliore con un buon DSL di builder, aggiornamenti in loco, utilizzo di XPath (DSL e String based) ecc., Suggerirei di dare un'occhiata alle Scale. Dal sito di rilascio 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") 
) 

Anche per la serializzazione diretta consente di sfruttare lo streaming, poiché il modello Scales Xml unifica il modello per lo streaming e l'elaborazione basata sull'albero.

Sono breve prima di un 0.3-RC6 con molti altri documenti (e un ottimo framework di confronto xml) ma sto aspettando di migrare prima a sonatype. (eta la prossima settimana)

+0

Sapete se esiste una libreria XML che in qualche modo integra i letterali XML di Scala? Penso che con i macro in 2.10 questo potrebbe diventare del tutto possibile. – ziggystar

+0

Sarei tentato di guardarlo, ma attualmente supporto 2.8.x, 2.9.x e mi piacerebbe supportare 2.10.x in modo uniforme. L'aggiunta del supporto macro per riutilizzare i letterali dovrebbe quindi essere un'altra lib (non significa che non lo farò comunque, solo per vedere se è possibile). Come per il tuo commento sopra, però, manca il supporto completo dello spazio dei nomi, le bilance si rivolgono direttamente agli spazi dei nomi, semplicemente non puoi avere un nome non qualificato in nessun sito di utilizzo. (L'analisi asincrona è comunque nella mia lista). – Chris

Problemi correlati