6

我有一些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 并复制属性等,但我可以删除命名空间或删除属性,但不能删除命名空间并保留属性。

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 回答