Scala XML\\copies xmlns属性。为什么,我怎样才能阻止它?

Scala XML\\copies xmlns属性。为什么,我怎样才能阻止它?,xml,scala,xml-namespaces,Xml,Scala,Xml Namespaces,在Scala REPL中: val input = <outerTag xmlns="http://xyz"> <innerTag> </innerTag> </outerTag> input\\@"innerTag" val输入= 输入\\@“innerTag” => 我如何阻止Scala这么做?为什么它不能给我?如何阻止这种情况发生(或者简单地删除xmlns属性) 谢谢 乔 澄清: 我的总体任务是切碎一个XML文件并重新组合它。因此,

在Scala REPL中:

val input = <outerTag xmlns="http://xyz"> <innerTag> </innerTag> </outerTag>

input\\@"innerTag"
val输入=
输入\\@“innerTag”
=>


我如何阻止Scala这么做?为什么它不能给我
?如何阻止这种情况发生(或者简单地删除
xmlns
属性)

谢谢

澄清:
我的总体任务是切碎一个XML文件并重新组合它。因此,该节点将从根节点(具有xmlns属性)下获取,然后集成回根节点下的文档中,该根节点再次具有xmlns。

在您的输入文档中,
具有逻辑名称空间
”http://xyz“
,因为其父元素
具有该命名空间。这就是XML名称空间的工作方式

当您单独请求
元素时,Scala会从父级
复制名称空间声明,因为名称空间是
的逻辑部分,即使它在初始文档中没有明确说明


如果要删除名称空间,必须执行一些额外的处理。

天哪,我希望我遗漏了什么。不会这么尴尬吧

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.xml_
导入scala.xml.tranform_
val rw=新的重写规则{
覆盖def变换(n:节点)=n匹配{
案例要素(p,l,a,s,儿童@*)=>要素(p,l,a,上视镜,儿童:*)
案例x=>x
}
覆盖def变换(ns:Seq[Node]):Seq[Node]=ns平面映射变换
}
val rt=新规则转换器(rw)
val输入=
val结果=输入\\“innerTag”映射rt

还是我被Scala宠坏了,认为这太复杂了?

在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>
scala>导入scala.xml_
导入scala.xml_
scala>val外部=
外部:scala.xml.Elem=
scala>outer\\\“innerTag”映射{case e e:Elem=>e.copy(scope=TopScope)}
res0:scala.xml.NodeSeq=

在将转换应用于文档的子节点时,我遇到了类似的问题。 结果节点上都有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) )}

谢谢我认为情况就是这样。考虑到%是Elem的成员而不是Node(这就是我要处理的),您对如何处理它有什么想法吗?对不起,我的Scala有点生疏了。您想从XML或从该XML派生的字符串中删除名称空间吗?可以这样做:我正在将其写回文件。我可以在之后用正则表达式来做,但我想在我翻转之前会有一个参数。请参阅澄清编辑。
错误:值副本不是使用最新scala的scala.xml.Elem的成员。奇怪的…@Joe复制方法在4周前的18757修订版中被添加到Elem中。如果你使用的是最新的夜间版本,你肯定会看到它。啊,不,我有稳定的版本(2.7.6)。我明天晚上再试试。谢谢
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) )}