2009-11-23 12 views
6

मेरे पास कुछ एक्सएमएल (यानी scala.xml.Elem) का स्कैला प्रतिनिधित्व है, और मैं इसे कुछ मानक जावा एक्सएमएल एपीआई (विशेष रूप से SchemaFactory) के साथ उपयोग करना चाहता हूं। ऐसा लगता है कि मेरे Elem को javax.xml.transform.Source में कनवर्ट करना है जो मुझे करने की ज़रूरत है, लेकिन मुझे यकीन नहीं है। मैं अपने Elem को प्रभावी रूप से लिखने के लिए विभिन्न तरीकों को देख सकता हूं और इसे जावा के साथ संगत कुछ में पढ़ सकता हूं, लेकिन मुझे आश्चर्य है कि क्या एक और अधिक सुरुचिपूर्ण (और उम्मीद है कि अधिक कुशल) दृष्टिकोण है?मैं jalaax.xml एपीआई के साथ संगत कुछ scala.xml.Elem कैसे परिवर्तित कर सकता हूं?

स्काला कोड:

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

तुम क्या चाहते संभव है - तुम सिर्फ धीरे स्काला संकलक कैसे एक निहित विधि की घोषणा के द्वारा javax.xml.transform.stream.StreamSource को scala.xml.Elem से जाने के लिए बताने के लिए की है।

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

प्रतिक्रिया के लिए धन्यवाद। हालांकि यह निश्चित रूप से इस तरह से अच्छा दिख रहा है, यह अभी भी एक स्ट्रिंग के लिए एलेम लिख रहा है और इसे वापस पढ़ रहा है, जिसे मैं टालने की उम्मीद कर रहा था। – overthink

+0

चूंकि विकल्प बिल्कुल बाढ़ नहीं आ रहे हैं, इसलिए मैं इस जवाब को स्वीकार करने जा रहा हूं (मैंने अपने ऐप में इस दृष्टिकोण से भी अटक गया है)। धन्यवाद। – overthink

+0

कोई समस्या नहीं है। काश मैं एक बेहतर जवाब के बारे में जानता था, लेकिन मैं जावा से बहुत परिचित नहीं हूँ। मैं स्कैला के कारण जावा पारिस्थितिकी तंत्र में वापस कूद रहा हूं। कम से कम इस तरह आपका कोड अधिक संक्षिप्त होगा। –

संबंधित मुद्दे