2010-01-04 8 views
9

Für die Verwendung einer 3rd-Party-Bibliothek brauche ich ein W3C-DOM-Dokument. Das Erstellen der XML-Knoten ist in Scala jedoch einfacher. Ich suche nach einer Möglichkeit, ein scala xml-Element in w3c dom zu konvertieren. Offensichtlich kann ich zu einer Schnur serialisieren und sie analysieren, aber ich suche nach etwas performanterem.Jede Konvertierung von Scalas XML zu W3c DOM?

Antwort

6

Hier ist eine einfache (keine Namespaces) Version, auf der Sie aufbauen können. Sollte die Idee geben. Ersetzen Sie einfach die Aufrufe von doc.createFoo (...) mit ihren entsprechenden doc.createFooNS (...) Einsen. Außerdem könnte eine intelligentere Handhabung der Attribute erforderlich sein. Aber das sollte für einfache Aufgaben funktionieren.

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