2010-01-04 27 views
9

對於使用第三方庫,我需要一個w3c DOM文檔。但是,在Scala中創建xml節點更容易。所以我正在尋找一種將scala xml元素轉換爲w3c dom的方法。顯然,我可以序列化爲一個字符串並解析它,但我正在尋找更高性能的東西。從scala的XML到w3c DOM的任何轉換?

回答

6

這是一個簡單的(無名字空間)版本,你可以建立。應該給出這個想法。只需用相應的doc.createFooNS(...)替換doc.createFoo(...)調用即可。另外,可能需要更智能地處理屬性。但是,這應該適用於簡單的任務。

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