2009-11-23 7 views
6

Tengo una representación de Scala de algunos XML (es decir, un scala.xml.Elem), y me gustaría utilizarlo con algunas de las API estándar XML de Java (específicamente SchemaFactory). Parece que la conversión de mi Elem a un javax.xml.transform.Source es lo que tengo que hacer, pero no estoy seguro. Puedo ver varias formas de escribir eficazmente mi Elem y leerlo en algo compatible con Java, pero me pregunto si hay un enfoque más elegante (y con suerte más eficiente).¿Cómo puedo convertir scala.xml.Elem a algo compatible con las API javax.xml?

código 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))) 

Respuesta

2

Lo que se desea es posible - sólo hay que contar con suavidad el compilador Scala cómo ir de scala.xml.Elem a javax.xml.transform.stream.StreamSource declarando una método implícito.

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) 

No es más eficiente, pero seguro que es más bonito una vez que la definición del método implícito fuera del camino.

+0

Gracias por la respuesta. Aunque definitivamente es más bonito mirar de esta manera, todavía está escribiendo el Elem en una cadena y leyéndolo de nuevo, lo cual esperaba evitar. – overthink

+0

Dado que las alternativas no están exactamente inundadas, voy a aceptar esta respuesta (también me he quedado con este enfoque en mi aplicación). Gracias. – overthink

+0

No hay problema. Ojalá supiera una mejor respuesta, pero no estoy muy familiarizado con Java. Estoy volviendo al ecosistema de Java debido a Scala. Al menos de esta manera tu código será más conciso. –

Cuestiones relacionadas