2010-01-04 12 views
9

Bir üçüncü taraf kitaplığı kullanmak için bir w3c DOM Belgesine ihtiyacım var. Ancak, xml düğümlerini oluşturmak Scala'da daha kolaydır. Yani bir scala xml öğesini w3c dom'a dönüştürmenin bir yolunu arıyorum. Açıkçası, bir dizeye serileştirebilir ve onu ayrıştırabilirim, ama daha performanslı bir şey arıyorum.Scala XML'inden w3c DOM'ye dönüşüm var mı?

cevap

6

Oluşturabileceğiniz basit (ad alanı olmayan) bir sürüm. Fikir vermeli. Sadece doc.createFoo (...) çağrılarını eşdeğer doc.createFooNS (...) ile değiştirin. Ayrıca, niteliklerin daha akıllıca ele alınması gerekebilir. Ancak, bu basit görevler için çalışmalıdır.

object ScalaDom { 
    import scala.xml._ 
    import org.w3c.dom.{Document => JDocument, Node => JNode} 
    import javax.xml.parsers.DocumentBuilderFactory 

    def dom(n: Node): JDocument = { 

    val doc = DocumentBuilderFactory 
       .newInstance 
       .newDocumentBuilder 
       .getDOMImplementation 
       .createDocument(null, null, null) 

    def build(node: Node, parent: JNode): Unit = { 
     val jnode: JNode = node match { 
     case e: Elem => { 
      val jn = doc.createElement(e.label) 
      e.attributes foreach { a => jn.setAttribute(a.key, a.value.mkString) } 
      jn 
     } 
     case a: Atom[_] => doc.createTextNode(a.text) 
     case c: Comment => doc.createComment(c.commentText) 
     case er: EntityRef => doc.createEntityReference(er.entityName) 
     case pi: ProcInstr => doc.createProcessingInstruction(pi.target, pi.proctext) 
     } 
     parent.appendChild(jnode) 
     node.child.map { build(_, jnode) } 
    } 

    build(n, doc) 
    doc 
    } 
}