Domanda

In Scala REPL:

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

input\\@"innerTag"

=>

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

Come faccio a interrompere la Scala a fare questo?Perché non è possibile che appena mi danno <innerTag> </innerTag>?Come posso impedire che questo avvenga (o rimuovere il xmlns attributi semplicemente)?

Grazie!

Joe

Chiarimento:Il mio compito generale è tagliare un file XML e la ricombinazione di esso.Quindi, questo nodo verrà preso da sotto il nodo principale (che ha l'attributo xmlns) e poi integrato in un documento sotto una radice che ha di nuovo il xmlns.

È stato utile?

Soluzione

Nel documento di input, <innerTag> è la logica dello spazio dei nomi "http://xyz" perché suo padre <outerTag> elemento che spazio dei nomi.Questo è il modo in cui gli spazi dei nomi XML lavoro.

Quando si chiede il <innerTag> elemento sua, Scala di copie dichiarazione dello spazio dei nomi da parte del genitore <outerTag>, perché lo spazio dei nomi è una parte logica del <innerTag>, anche se non è stato esplicitamente indicato nel documento iniziale.

Se si desidera rimuovere lo spazio dei nomi, dovrete effettuare qualche ulteriore elaborazione di farlo.

Altri suggerimenti

Utilizzare un parametro denominato e Elem.(copia) in 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>

Dio, spero che mi manca qualcosa.Si non può essere questo imbarazzante!

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 sono io troppo viziati con Scala a pensare che questo è troppo complesso?

Mi sono imbattuto in un problema simile quando l'applicazione si trasforma in sub-nodi di un documento.La risultante di tutti i nodi avuto la xmlns sui nodi.

Dopo aver completato la trasformazione che ho usato la funzione riportata di seguito per 'pulire' il documento ai fini della stampa.

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) )}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top