2012-09-21 2 views
4

에서 네임 스페이스를 제거 :스칼라 - 나는 일부 XML이 완전히 XML

<item name="ed" test="true" 
    xmlns="http://www.somenamespace.com" 
    xmlns:xsi="http://www.somenamespace.com/XMLSchema-instance"> 
    <blah> 
    <node>value</node> 
    </blah> 
</item> 

나는이 XML을 통해 이동하고, 완전히 그들이 상관없이 모든 네임 스페이스를 제거 할를. 스칼라로 어떻게하면 좋을까요?

<item name="ed" test="true"> 
    <blah> 
    <node>value</node> 
    </blah> 
</item> 

나는 등의 속성을 통해 RuleTransform 및 복사에서 찾아 봤는데,하지만 난 네임 스페이스를 제거하거나 특성을 제거하지만 네임 스페이스를 제거하고 속성을 유지 할 수 있습니다.

답변

6

태그는 Elem 개체이고 이름 공간은 scope 값으로 제어됩니다. 그래서 그것을 제거하기 위해 다음과 같이 사용할 수 있습니다

xmlElem.copy(scope = TopScope) 

그러나 이것은 불변의 순환 구조 재귀 방식으로이 작업을 수행 할 필요가 있도록 :

import scala.xml._ 

def clearScope(x: Node):Node = x match { 
    case e:Elem => e.copy(scope=TopScope, child = e.child.map(clearScope)) 
    case o => o 
} 

이 기능은 제거 XML 트리를 복사합니다 모든 노드의 스코프 속성에서 범위를 제거해야 할 수도 있습니다.

1

다음은 네임 스페이스와 요소 및 특성을 재귀 적으로 제거해야합니다.

<foo xmlns:xoox="http://example.com/xoox"> 
    <baz xoox:asd="first">123</baz> 
    <xoox:baz xoox:asd="second">456</xoox:baz> 
</foo> 
:

def removeNamespaces(node: Node): Node = { 
    node match { 
    case elem: Elem => { 
     elem.copy(
     scope = TopScope, 
     prefix = null, 
     attributes = removeNamespacesFromAttributes(elem.attributes), 
     child = elem.child.map(removeNamespaces) 
    ) 
    } 
    case other => other 
    } 
} 

def removeNamespacesFromAttributes(metadata: MetaData): MetaData = { 
    metadata match { 
    case UnprefixedAttribute(k, v, n) => new UnprefixedAttribute(k, v, removeNamespacesFromAttributes(n)) 
    case PrefixedAttribute(pre, k, v, n) => new UnprefixedAttribute(k, v, removeNamespacesFromAttributes(n)) 
    case Null => Null 
    } 
} 

그것은 최소한 다음 테스트 케이스 근무

관련 문제