2009-11-23 73 views
6

我有一些XML的Scala表示(即scala.xml.Elem),我想用它與一些標準的Java XML API(特別是SchemaFactory)。它看起來像我的Elem轉換爲javax.xml.transform.Source是我需要做的,但我不知道。我可以看到各種方法來有效地寫出我的Elem並將其讀入與Java兼容的某些東西,但我想知道是否有更優雅的方法(並且希望效率更高)?如何將scala.xml.Elem轉換爲與javax.xml API兼容的東西?

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

回答

2

你想要的是可能 - 你只需要輕輕地告訴Scala編譯器如何從scala.xml.Elem通過聲明隱式方法javax.xml.transform.stream.StreamSource

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) 

它不是更有效率,但它肯定是更漂亮,一旦你隱式方法定義的方式。

+0

感謝您的回覆。雖然這種方式看起來更好,但它仍然將Elem寫入字符串並將其讀回,這是我希望避免的。 – overthink 2009-11-24 13:49:57

+0

由於替代品並沒有完全氾濫,我將接受這個答案(我也堅持在我的應用程序中使用這種方法)。謝謝。 – overthink 2009-11-27 14:05:11

+0

沒問題。我希望我知道更好的答案,但我對Java不太熟悉。我因爲Scala而跳入Java生態系統。至少這樣你的代碼會更加簡潔。 – 2009-11-27 18:04:16

相關問題