3 Stimmen

Scala XML \\ kopiert das xmlns-Attribut. Warum und wie kann ich das verhindern?

In Scala REPL:

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

input\\@"innerTag"

\=>

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

Wie halte ich Scala davon ab, dies zu tun? Warum kann es mir nicht einfach <innerTag> </innerTag> ? Wie kann ich dies verhindern (oder die xmlns Attribute einfach)?

Gracias.

Joe

Klarstellung: Meine Gesamtaufgabe besteht darin, eine XML-Datei zu zerlegen und neu zusammenzusetzen. Dieser Knoten wird also unter dem Root-Knoten (der das xmlns-Attribut hat) entnommen und dann wieder in ein Dokument unter einem Root-Knoten integriert, der wiederum das xmlns-Attribut hat.

3voto

skaffman Punkte 389758

In Ihrem Eingabedokument, <innerTag> hat den logischen Namensraum "http://xyz" weil seine Muttergesellschaft <outerTag> Element diesen Namespace hatte. So funktionieren die XML-Namensräume.

Wenn Sie nach dem <innerTag> Element auf sich allein gestellt ist, kopiert Scala die Namespace-Deklaration aus dem übergeordneten <outerTag> weil der Namensraum ein logischer Teil der <innerTag> auch wenn dies im ursprünglichen Dokument nicht ausdrücklich erwähnt wurde.

Wenn Sie den Namespace entfernen möchten, müssen Sie dazu einige zusätzliche Verarbeitungen vornehmen.

3voto

Walter Chang Punkte 11399

Benannte Parameter und Elem.copy() in Scala 2.8.0 verwenden:

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>

1voto

Daniel C. Sobral Punkte 290004

Gott, ich hoffe, ich verpasse etwas. Es kann nicht so peinlich sein!

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 zu denken, dies ist übermäßig komplex?

1voto

Paul Punkte 11

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

Nach Abschluss der Umwandlung habe ich die folgende Funktion verwendet, um das Dokument für den Druck zu "bereinigen".

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) )}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X