2009-11-23 4 views
6

Possiedo una rappresentazione Scala di un file XML (ad esempio un scala.xml.Elem) e mi piacerebbe utilizzarlo con alcune delle API Java XML standard (in particolare SchemaFactory). Sembra che convertire il mio Elem in un javax.xml.transform.Source sia quello che devo fare, ma non ne sono sicuro. Riesco a vedere vari modi per scrivere in modo efficace il mio Elem e leggerlo in qualcosa di compatibile con Java, ma mi chiedo se c'è un approccio più elegante (e si spera più efficiente)?Come posso convertire scala.xml.Elem in qualcosa di compatibile con le API javax.xml?

codice Scala:

import java.io.StringReader 
import javax.xml.transform.stream.StreamSource 
import javax.xml.validation.{Schema, SchemaFactory} 
import javax.xml.XMLConstants 

val schemaXml = <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
        <xsd:element name="foo"/> 
       </xsd:schema> 
val schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 

// not possible, but what I want: 
// val schema = schemaFactory.newSchema(schemaXml) 

// what I'm actually doing at present (ugly) 
val schema = schemaFactory.newSchema(new StreamSource(new StringReader(schemaXml.toString))) 

risposta

2

Ciò che si vuole è possibile - devi solo dire delicatamente il compilatore Scala come andare da scala.xml.Elem a javax.xml.transform.stream.StreamSource dichiarando un metodo implicito.

import java.io.StringReader 
import javax.xml.transform.stream.StreamSource 
import javax.xml.validation.{Schema, SchemaFactory} 
import javax.xml.XMLConstants 
import scala.xml.Elem 

val schemaXml = <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
        <xsd:element name="foo"/> 
       </xsd:schema> 
val schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 

implicit def toStreamSource(x:Elem) = new StreamSource(new StringReader(x.toString)) 

// Very possible, possibly still not any good: 
val schema = schemaFactory.newSchema(schemaXml) 

Non è più efficiente, ma è sicuramente più bello una volta a ottenere la definizione metodo implicito fuori strada.

+0

Grazie per la risposta. Anche se è decisamente più bello in questo modo, sta ancora scrivendo la Elem out to a String e rileggendola, cosa che speravo di evitare. – overthink

+0

Poiché le alternative non sono esattamente allagate, accetterò questa risposta (ho anche bloccato questo approccio nella mia app). Grazie. – overthink

+0

Nessun problema. Vorrei sapere una risposta migliore, ma non ho molta familiarità con Java. Sto tornando all'ecosistema Java grazie a Scala. Almeno in questo modo il tuo codice sarà più conciso. –