Scala - 从XML中完全删除命名空间

7

我有一些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并复制属性等内容,但我要么删除命名空间,要么删除属性,而无法去除命名空间并保留属性。

2个回答

11

标签是 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树,并从所有节点中删除范围。您可能还需要从属性中删除范围。


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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接