Question

Dans Scala REPL:

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

input\\@"innerTag"

= >

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

Comment puis-je arrêter Scala? Pourquoi ne puis-je pas simplement me donner <innerTag> </innerTag>? Comment puis-je empêcher cela (ou supprimer simplement les xmlns attributs)?

Merci!

Joe

Clarification: Ma tâche générale consiste à découper un fichier XML et à le recombiner. Donc, ce nœud sera pris sous le nœud racine (qui a l'attribut xmlns), puis intégré dans un document sous une racine qui a encore le xmlns.

Était-ce utile?

La solution

Dans votre document d'entrée, <innerTag> a l'espace de noms logique "http://xyz" car son élément parent <outerTag> avait cet espace de noms. C’est ainsi que fonctionnent les espaces de noms XML.

Lorsque vous demandez l'élément <=> seul, Scala copie la déclaration d'espace de nom du parent <=>, car l'espace de nom est une partie logique de <=>, même si cela n'a pas été explicitement indiqué dans le document initial.

Si vous souhaitez supprimer l'espace de noms, vous devrez effectuer un traitement supplémentaire.

Autres conseils

Utilisez le paramètre nommé et Elem.copy () dans 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>

Mon dieu, j'espère que je manque quelque chose. Cela ne peut pas être aussi gênant!

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

Ou suis-je trop gâté avec Scala pour penser que c'est trop complexe?

J'ai rencontré un type de problème similaire lors de l'application de transformations aux sous-nœuds d'un document. Les nœuds résultants avaient tous les xmlns sur les nœuds.

Une fois la transformation terminée, j'ai utilisé la fonction suivante pour "nettoyer" le document à des fins d'impression.

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) )}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top