문제

Scala Repl :

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

input\\@"innerTag"

=>

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

스칼라를 막으려면 어떻게해야하나요? 왜 나에게 줄 수 없어 <innerTag> </innerTag>? 이런 일을 멈출 수있는 방법 (또는 xmlns 간단히 속성)?

감사!

설명 : 내 전반적인 작업은 XML 파일을 자르고 재결합하는 것입니다. 따라서이 노드는 루트 노드 아래 (XMLNS 속성이 있음) 아래에서 가져온 다음 다시 XMLN이있는 루트 아래의 문서로 다시 통합됩니다.

도움이 되었습니까?

해결책

입력 문서에서 <innerTag> 논리 네임 스페이스가 있습니다 "http://xyz" 부모 때문입니다 <outerTag> 요소에는 그 네임 스페이스가있었습니다. 그것이 XML 네임 스페이스가 작동하는 방식입니다.

당신이 요청할 때 <innerTag> 스칼라는 자체적으로 요소가 부모로부터 네임 스페이스 선언을 복사합니다. <outerTag>, 네임 스페이스는 <innerTag>, 초기 문서에 명시 적으로 명시되지 않았더라도.

네임 스페이스를 제거하려면 추가 처리를 수행해야합니다.

다른 팁

Scala 2.8.0에서 명명 된 매개 변수 및 elem.copy ()를 사용하십시오.

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>

신, 내가 뭔가를 놓치기를 바랍니다. 그것 캔트 이건 어색해!

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

아니면 너무 복잡하다고 생각하기 위해 스칼라를 망쳐 놓았습니까?

문서의 하위 노드로 변환을 적용 할 때 일종의 비슷한 문제를 해결했습니다. 결과 노드는 모두 노드에 XMLN을 가졌습니다.

변환을 완료 한 후 다음 기능을 사용하여 인쇄 목적으로 문서를 '청소'했습니다.

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) )}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top