6

I have some 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>

I want to go through this xml and remove all namespaces completely, no matter where they are. How would I do this with Scala?

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

I've been looking at RuleTransform and copying over attributes etc, but I can either remove the namespaces or remove the attributes but not remove the namespace and keep the attributes.

4

2 に答える 2

10

タグは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 ツリーをコピーして、すべてのノードのスコープを削除します。属性からもスコープを削除する必要がある場合があります。

于 2012-12-07T17:20:15.413 に答える
3

以下は、要素と属性から名前空間を再帰的に削除する必要があります。

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>
于 2013-10-17T11:46:04.197 に答える