2012-09-21 106 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和完全刪除所有的命名空間,無論他們在哪裏。我將如何與Scala做到這一點?

<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

以下應遞歸刪除名稱空間和元素和屬性。

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

它的工作,至少在以下測試案例:

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