Pregunta

En Scala REPL:

val input = <outerTag xmlns="http://xyz"> <innerTag> </innerTag> </outerTag>

input\\@"innerTag"

= >

<innerTag xmlns="http://xyz"> </innerTag>

¿Cómo evito que Scala haga esto? ¿Por qué no me puede dar <innerTag> </innerTag>? ¿Cómo puedo evitar que esto suceda (o eliminar los xmlns atributos simplemente)

¡Gracias!

Joe

Aclaración: Mi tarea general es cortar un archivo XML y recombinarlo. Entonces, este nodo se tomará de debajo del nodo raíz (que tiene el atributo xmlns) y luego se integrará nuevamente en un documento debajo de una raíz que nuevamente tiene los xmlns.

¿Fue útil?

Solución

En su documento de entrada, <innerTag> tiene el espacio de nombres lógico "http://xyz" porque su elemento padre <outerTag> tenía ese espacio de nombres. Así funcionan los espacios de nombres XML.

Cuando solicita el elemento <=> por sí solo, Scala copia la declaración del espacio de nombres del padre <=>, porque el espacio de nombres es una parte lógica de <=>, incluso si no se indicó explícitamente en el documento inicial.

Si desea eliminar el espacio de nombres, deberá realizar un procesamiento adicional para hacerlo.

Otros consejos

Use el parámetro con nombre y Elem.copy () en Scala 2.8.0:

scala> import scala.xml._
import scala.xml._

scala> val outer = <outerTag xmlns="http://xyz"><innerTag></innerTag></outerTag>
outer: scala.xml.Elem = <outerTag xmlns="http://xyz"><innerTag></innerTag></outerTag>

scala> outer \\ "innerTag" map { case e: Elem => e.copy(scope = TopScope) }
res0: scala.xml.NodeSeq = <innerTag></innerTag>

Dios, espero que me falte algo. ¡ no puede ser tan incómodo!

import scala.xml._
import scala.xml.tranform._

val rw = new RewriteRule { 
  override def transform(n: Node) = n match {
    case Elem(p, l, a, s, children@ _*) => Elem(p, l, a, TopScope, children: _*)
    case x => x
  }
  override def transform(ns: Seq[Node]): Seq[Node] = ns flatMap transform
}
val rt = new RuleTransformer(rw)

val input = <outerTag xmlns="http://xyz"> <innerTag> </innerTag> </outerTag>

val result = input \\ "innerTag" map rt

¿O estoy demasiado mimado con Scala para pensar que esto es demasiado complejo?

Me encontré con un tipo de problema similar al aplicar transformaciones a subnodos de un documento. Los nodos resultantes tenían todos los xmlns en los nodos.

Después de completar la transformación, utilicé la siguiente función para 'limpiar' el documento con el propósito de imprimirlo.

def transformForPrinting(doc : Elem) : Elem = { 
 def stripNamespaces(node : Node) : Node = {
     node match {
         case e : Elem => 
             e.copy(scope = TopScope, child = e.child map (stripNamespaces))
         case _ => node;
     }
 }
 doc.copy( child = doc.child map (stripNamespaces) )}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top