El título es bastante autoexplicativo. ¿Cómo puedo convertir una instancia de org.w3c.dom.Document en un Scala NodeSeq, para disfrutar de su facilitación?Scala: Convert org.w3c.dom.Document a scala.xml.NodeSeq
Saludos
Parsa
El título es bastante autoexplicativo. ¿Cómo puedo convertir una instancia de org.w3c.dom.Document en un Scala NodeSeq, para disfrutar de su facilitación?Scala: Convert org.w3c.dom.Document a scala.xml.NodeSeq
Saludos
Parsa
def asXml(dom: org.w3c.dom.Node): Node = {
val dom2sax = new DOM2SAX(dom)
val adapter = new NoBindingFactoryAdapter
dom2sax.setContentHandler(adapter)
dom2sax.parse()
return adapter.rootElem
}
yo escribimos este código hace un tiempo para ir en la otra dirección, desde un nodo a un nodo Scala DOM4J. Se muestra la idea básica de manera recursiva sobre un árbol y debe ser lo suficientemente fácil de adaptar:
implicit def scalaToDom4j(n : Node) : DElem = {
def inner(n : Node) : Option[DNode] = {
n match {
case e : Elem =>
val elem = DocumentHelper.createElement(e.label)
for(c <- e.child) yield inner(c) collect {
case Some(child) => elem.add(child)
}
Some(elem)
//as Scala's xml is type-aware, text might not actually be a Text node,
//but an Atom of some other type
case t : Atom[_] =>
Some(DocumentHelper.createText(t.data.toString))
case x => None
}
}
//Attempt the conversion. Throw an exception if something has gone badly wrong
//inner returns an Option[DNode], but the expected top-level type is a DElem
// (which is a subclass of DNode)
//so we also validate this.
inner(trim(n)) map (_.asInstanceOf[DElem]) getOrElse (error("xml failed"))
}
que tienen recursivo similar código de coincidencia de patrón para la scalaToDom4j función (n) anterior, sólo en el Saxon XdmNode hasta la dirección Scala Node up en: https://github.com/LeifW/MusicPath/blob/master/src/main/scala/org/musicpath/saxon2scala/Saxon2Scala.scala
Actualmente solo crea nodos de atributo de texto, elemento y espacio sin nombre, pero debería ser fácil de generalizar/terminar.
La respuesta de IttayD es buena para todos los w3c XML, excepto dom4j w3c compatible con xmls. las siguientes obras para todos los tipos del W3C:
def asXml(dom: _root_.org.w3c.dom.Node): Node = {
val source = new DOMSource(dom)
val adapter = new NoBindingFactoryAdapter
val saxResult = new SAXResult(adapter)
val transformerFactory = javax.xml.transform.TransformerFactory.newInstance()
val transformer = transformerFactory.newTransformer()
transformer.transform(source, saxResult)
adapter.rootElem
}
Digo lo mismo que con IttayD: Por favor: En el código de ejemplo nombres de clase completamente calificados. Gracias. Y es malo que 'javax.xml.transform.dom.DOMSource' no esté disponible en Android API <8. Pero supongo que ese no es tu problema. – Martin
¿De dónde viene tu 'transformerFactory'? –
@ Jean-Philippe Pellet hay un val transformerFactory = javax.xml.transform.TransformerFactory.newInstance() definido en el objeto contenedor. –
Las preguntas son para un convertidor de '' org.w3c.dom.Document' a scala.xml.NodeSeq' pero su código toman un 'org.w3c.dom. Nodo' como parámetro. - Y tener las 'importaciones' apropiadas siempre lo hace un poco más fácil. – Martin
Encontré 'scala.xml.parsing.NoBindingFactoryAdapter' pero no puedo encontrar' DOM2SAX' por menos dinero. O mejor, google devuelve muchos resultados, así que no sé cuál es el indicado. - Por favor: En el código de ejemplo nombres de clase totalmente calificados. Gracias – Martin
Supongo que quería decir 'org.apache.xalan.xsltc.trax.DOM2SAX' que no solo significa que uno tiene que saber el nombre del paquete. También hay que averiguar en qué biblioteca externa se encuentra. - Así que queda uno: cómo convertir un 'org.w3c.dom.Document' en un' org.w3c.dom.Node'. – Martin