Frage

In Scala Repl:

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

input\\@"innerTag"

=>

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

Wie höre ich auf, dass Scala das mache? Warum kann es mir nicht einfach geben? <innerTag> </innerTag>? Wie kann ich dies stoppen (oder das entfernen xmlns Attribute einfach)?

Vielen Dank!

Joe

Klärung: Meine allgemeine Aufgabe ist es, eine XML -Datei zu zerhacken und zu rekombinieren. Daher wird dieser Knoten unter dem Root -Knoten (mit dem XMLNS -Attribut) untergebracht und dann in ein Dokument unter einem Wurzel integriert, das wiederum die XMLNs hat.

War es hilfreich?

Lösung

In Ihrem Eingabedokument, <innerTag> hat den logischen Namespace "http://xyz" Weil seine Eltern <outerTag> Element hatte diesen Namespace. So funktionieren XML -Namespaces.

Wenn Sie nach dem fragen <innerTag> Das Element für sich selbst kopiert die Namespace -Erklärung des Elternteils <outerTag>, weil der Namespace ein logischer Teil der ist <innerTag>, Auch wenn es im ersten Dokument nicht ausdrücklich angegeben war.

Wenn Sie den Namespace entfernen möchten, müssen Sie dazu eine zusätzliche Verarbeitung durchführen.

Andere Tipps

Verwenden Sie den benannten Parameter und Elem.copy () 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>

Gott, ich hoffe ich vermisse etwas. Es kippen Sei das umständlich!

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

Oder bin ich zu verwöhnt mit Scala, um zu denken, dass dies zu komplex ist?

Ich bin auf ein ähnliches Problem gestoßen, als ich Transformationen auf Unternoten eines Dokuments angewendet habe. Die resultierenden Knoten hatten alle die XMLNs auf den Knoten.

Nach Abschluss der Transformation verwendete ich die folgende Funktion, um das Dokument zum Drucken zu "reinigen".

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) )}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top