2009-11-23 12 views
6

Tôi có một đại diện Scala của một số XML (ví dụ: scala.xml.Elem) và tôi muốn sử dụng nó với một số API Java XML chuẩn (cụ thể là SchemaFactory). Có vẻ như chuyển đổi số Elem thành số javax.xml.transform.Source là những gì tôi cần làm, nhưng tôi không chắc chắn. Tôi có thể thấy nhiều cách khác nhau để viết một cách hiệu quả số Elem và đọc nó vào một cái gì đó tương thích với Java, nhưng tôi tự hỏi nếu có một cách tiếp cận thanh lịch hơn (và hy vọng hiệu quả hơn)?Làm cách nào để chuyển đổi scala.xml.Elem thành một cái gì đó tương thích với các API javax.xml?

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

Trả lời

2

gì bạn muốn là thể - bạn chỉ cần nhẹ nhàng nói với trình biên dịch Scala thế nào để đi từ scala.xml.Elem để javax.xml.transform.stream.StreamSource bằng cách tuyên bố một phương pháp ngầm.

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) 

Nó không hiệu quả hơn, nhưng chắc chắn sẽ đẹp hơn khi bạn nhận được định nghĩa phương thức ẩn.

+0

Cảm ơn bạn đã trả lời. Trong khi nó chắc chắn đẹp hơn theo cách này, nó vẫn viết Elem ra một String và đọc nó trở lại, mà tôi đã hy vọng để tránh. – overthink

+0

Vì các lựa chọn thay thế không chính xác là ngập lụt, tôi sẽ chấp nhận câu trả lời này (tôi cũng bị mắc kẹt với cách tiếp cận này trong ứng dụng của mình). Cảm ơn. – overthink

+0

Không sao cả. Tôi muốn tôi biết một câu trả lời tốt hơn, nhưng tôi không quá quen thuộc với Java. Tôi đang nhảy trở lại hệ sinh thái Java vì Scala. Ít nhất theo cách này, mã của bạn sẽ súc tích hơn. –

Các vấn đề liên quan