2010-01-04 12 views
9

Per l'utilizzo di una libreria di terze parti, ho bisogno di un documento DOM w3c. Tuttavia, la creazione dei nodi xml è più semplice in Scala. Quindi sto cercando un modo per convertire un elemento scala xml in dom w3c. Ovviamente, posso serializzare su una stringa e analizzarla, ma sto cercando qualcosa di più performante.Qualche conversione dal XML di scala al DOM w3c?

risposta

6

Ecco una versione semplice (senza spazi dei nomi) che è possibile creare. Dovrebbe dare l'idea. Basta sostituire le chiamate doc.createFoo (...) con i loro equivalenti doc.createFooNS (...). Inoltre, potrebbe essere necessaria una gestione più intelligente degli attributi. Ma questo dovrebbe funzionare per compiti semplici.

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