在Scala REPL中:
val input = <outerTag xmlns="http://xyz"> <innerTag> </innerTag> </outerTag>
input\\@"innerTag"
=&GT;
<innerTag xmlns="http://xyz"> </innerTag>
如何阻止Scala这样做?为什么不能只给我<innerTag> </innerTag>
?如何阻止这种情况发生(或简单地删除xmlns
属性)?
谢谢!
乔
澄清: 我的总体任务是砍掉一个XML文件并重新组合它。因此,此节点将从根节点(具有xmlns属性)下方获取,然后集成回根目录下的文档,该根目录再次具有xmlns。
答案 0 :(得分:3)
在输入文档中,<innerTag>
具有逻辑命名空间"http://xyz"
,因为其父<outerTag>
元素具有该命名空间。这就是XML命名空间的工作方式。
当您自己请求<innerTag>
元素时,Scala会从父<outerTag>
复制名称空间声明,因为命名空间是<innerTag>
的逻辑部分,即使它在初始文件中没有明确说明。
如果要删除命名空间,则必须执行一些额外的处理。
答案 1 :(得分:3)
在Scala 2.8.0中使用命名参数和Elem.copy():
scala> import scala.xml._
import scala.xml._
scala> val outer = <outerTag xmlns="http://xyz"><innerTag></innerTag></outerTag>
outer: scala.xml.Elem = <outerTag xmlns="http://xyz"><innerTag></innerTag></outerTag>
scala> outer \\ "innerTag" map { case e: Elem => e.copy(scope = TopScope) }
res0: scala.xml.NodeSeq = <innerTag></innerTag>
答案 2 :(得分:1)
上帝,我希望我错过了一些东西。 不能这个尴尬!
import scala.xml._
import scala.xml.tranform._
val rw = new RewriteRule {
override def transform(n: Node) = n match {
case Elem(p, l, a, s, children@ _*) => Elem(p, l, a, TopScope, children: _*)
case x => x
}
override def transform(ns: Seq[Node]): Seq[Node] = ns flatMap transform
}
val rt = new RuleTransformer(rw)
val input = <outerTag xmlns="http://xyz"> <innerTag> </innerTag> </outerTag>
val result = input \\ "innerTag" map rt
或者我是否因为Scala太过于害怕而认为这太复杂了?
答案 3 :(得分:1)
当将变换应用于文档的子节点时,我遇到了类似的问题。 结果节点都在节点上有xmlns。
完成转换后,我使用以下函数“清理”文档以进行打印。
def transformForPrinting(doc : Elem) : Elem = {
def stripNamespaces(node : Node) : Node = {
node match {
case e : Elem =>
e.copy(scope = TopScope, child = e.child map (stripNamespaces))
case _ => node;
}
}
doc.copy( child = doc.child map (stripNamespaces) )}