Scala XML \\ copie attributo xmlns.Perché e come posso fermarlo?
-
05-07-2019 - |
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.
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) )}