Любое преобразование из XML Scala в DOM W3C? - PullRequest
9 голосов
/ 05 января 2010

Для использования сторонней библиотеки мне нужен документ w3c DOM. Тем не менее, создание узлов XML проще в Scala. Поэтому я ищу способ преобразования элемента scala xml в w3c dom. Очевидно, я могу сериализовать строку и разобрать ее, но я ищу что-то более производительное.

1 Ответ

7 голосов
/ 05 января 2010

Вот простая (без пространств имен) версия, на которой вы можете построить. Должен дать идею. Просто замените вызовы doc.createFoo (...) их эквивалентными вызовами doc.createFooNS (...). Также может потребоваться более умная обработка атрибутов. Но это должно работать для простых задач.

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