2009-11-23 11 views
6

Bazı XML (örneğin, scala.xml.Elem) Scala gösterimi var ve bunu standart Java XML API'lerinden bazılarıyla kullanmak istiyorum (özellikle SchemaFactory). Elem'u javax.xml.transform.Source'a dönüştürmem gerekiyor, yapmam gereken şey ama emin değilim. Elem'u etkin bir şekilde yazmam ve Java ile uyumlu bir şeye okumanın çeşitli yollarını görebiliyorum ama daha zarif (ve umarım daha verimli) bir yaklaşımın var mı diye merak ediyorum.scala.xml.Elem'i javax.xml API'leriyle uyumlu bir şeye nasıl dönüştürebilirim?

Scala kodu: Ne istiyorsun

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))) 

cevap

2

mümkün - sadece hafifçe bir örtülü yöntemi bildirerek javax.xml.transform.stream.StreamSource için scala.xml.Elem diğerine nasıl geçeceğinizi Scala derleyici söylemek zorundayız.

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) 

Bu artık verimli değildir, ancak yolumdan kapalı yöntem tanımını bir kez daha emin daha güzel olduğunu.

+0

Yanıt için teşekkürler. Bu şekilde kesinlikle daha güzel görünmekle birlikte, hala Elem'i bir String'e yazıyor ve geri almayı umuyordum. – overthink

+0

Alternatifler tam olarak sel baskın olmadığından, bu cevabı kabul edeceğim (uygulamamdaki bu yaklaşıma da takıldım). Teşekkürler. – overthink

+0

Sorun değil. Keşke daha iyi bir cevabı biliyor olsaydım, ama Java'ya fazla aşina değilim. Scala'dan dolayı Java ekosistemine geri dönüyorum. En azından bu şekilde kodunuz daha özlü olacak. –