2009-10-21 6 views
2

:스칼라 XML \은 xmlns 특성을 복사합니다. 왜, 어떻게 멈출 수 있습니까? 스칼라 REPL에서

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

input\\@"innerTag" 

=>

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

어떻게 스칼라 이렇게 중지합니까? 왜 내게 <innerTag> </innerTag>을 줄 수 없습니까? 어떻게 이런 일을 멈추게 할 수 있습니까 (또는 단순히 xmlns 속성을 제거 할 수 있습니까?).

감사합니다.

명확한 설명 : 내 전체 작업은 XML 파일을 자르고 그것을 재결합한다. 따라서이 노드는 루트 노드 (xmlns 속성을 가짐) 아래에서 가져온 다음 다시 xmlns가있는 루트 아래의 문서에 다시 통합됩니다.

+0

XML 또는 XML에서 파생 된 문자열에서 네임 스페이스를 제거 하시겠습니까? –

+0

어느 쪽이든 할 것이다 : 나는 그것을 파일로 다시 쓰고있다. 나는 정규 표현식으로 그것을 할 수 있었지만, 나는 뒤집을 수있는 매개 변수가있을 것이라고 생각했다. 설명 편집을 참조하십시오. – Joe

답변

3

입력 문서에서 <innerTag>의 부모는 <outerTag> 요소에 해당 네임 스페이스가 있으므로 "http://xyz" 인 논리 네임 스페이스가 있습니다. 그것이 XML 네임 스페이스가 작동하는 방식입니다. 당신이 자신의 <innerTag> 요소에 대해 물어 보면

는 네임 스페이스가 명시 적으로 초기 문서에 명시되지 않은 경우에도 <innerTag>의 논리적 부분 스칼라 복사 부모 <outerTag>에서 네임 스페이스 선언이기 때문이다.

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

+0

감사합니다. 나는 그런 경우를 생각했다. 그것을 처리하는 방법에 대한 아이디어는, %는 Elem의 멤버이지만 Node는 아닙니다 (내가 처리하고있는 것입니다)? – Joe

+0

죄송합니다, 스칼라가 녹슬 었습니다. – skaffman

1

하나님, 나는 뭔가를 놓치고 싶습니다. 그것은 수 없습니다 어색해!

import scala.xml._ 
import scala.xml.tranform._ 

val rw = new RewriteRule { 
    override def transform(n: Node) = n match { 
    case Elem(p, l, a, s, [email protected] _*) => 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 

아니면 너무 지나치게 복잡하다고 생각해서 스칼라로 망쳤습니까? 스칼라 2.8.0에서

3

사용 명명 된 매개 변수와 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> 
+0

'error : 값 copy는 scala.xml.Elem의 멤버가 아닙니다 .' 최신 스칼라를 사용하고 있습니다. 기괴한 ... – Joe

+0

@Joe 복사 방법이 4 주 전에 있었던 Revision 18757의 Elem에 추가되었습니다. 최신 야간 사용중인 경우 반드시 볼 수 있습니다. –

+0

아, 안정 버전 (2.7.6)을 가지고있었습니다. 나는 내일 밤에 다시 시도 할 것이다. 감사! – Joe

1

나는 비슷한 문제의 종류에 달렸다. 결과 노드에는 모두 노드에 xmlns가 있습니다.

변형을 완료 한 후 인쇄를 위해 문서를 '정리'하는 데 다음 기능을 사용했습니다.

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))} 
관련 문제