Vra

In Scala REPUBLIEK:

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

input\\@"innerTag"

=>

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

Hoe kan ek ophou Scala doen dit? Hoekom kan dit nie net gee my <innerTag> </innerTag>? Hoe kan ek ophou gebeur (of verwyder die xmlns skryf net)?

Dankie!

Joe

Verduideliking: My algehele taak is kap van 'n XML-lêer en recombining dit. So hierdie knoop sal geneem word uit onder die wortel node (wat het die xmlns skryf) en dan geïntegreer terug in 'n dokument onder 'n wortel wat weer het die xmlns.

Was dit nuttig?

Oplossing

In jou insette dokument, <innerTag> het die logiese naamruimte "http://xyz" omdat sy ouer <outerTag> element gehad wat naamruimte. Dis hoe XML name spaces werk.

As jy vra vir die <innerTag> element op sy eie, Scala afskrifte die naam ruimte verklaring van die ouer <outerTag>, omdat die naamruimte is 'n logiese deel van die <innerTag>, selfs al is dit nie uitdruklik aangedui word in die aanvanklike dokument.

As jy wil hê dat die naamruimte te verwyder, sal jy 'n paar ekstra verwerking uit te voer om dit te doen.

Ander wenke

Gebruik die naam parameter en 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>

God, ek hoop ek iets mis. Dit kan nie word hierdie ongemaklike!

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

Of is ek te bederf met Scala om te dink dit is té kompleks?

Ek het in 'n soort van 'n soortgelyke probleem wanneer jy aansoek doen transforms om sub-nodes van 'n dokument. Die gevolglike nodes al het die xmlns op die nodes.

Na voltooiing van die transformasie gebruik ek die volgende funksie te 'skoon' die dokument vir die doeleindes van die druk.

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) )}
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top