2009-10-21 54 views
2

在斯卡拉REPL:Scala XML \複製xmlns屬性。爲什麼以及如何阻止它?

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

input\\@"innerTag" 

=>

<innerTag xmlns="http://xyz"> </innerTag> 

如何停止斯卡拉做到這一點?爲什麼它不能給我<innerTag> </innerTag>?我怎樣才能阻止這種情況發生(或簡單地刪除xmlns屬性)?

謝謝!

澄清: 我的總體任務拿刀砍一個XML文件和重組它。因此,此節點將從根節點(具有xmlns屬性)下取出,然後再集成回到具有xmlns的根下的文檔中。

+0

是否要從XML或從該XML派生的字符串中刪除命名空間? – 2009-10-21 16:04:11

+0

要麼:我正在將它寫回文件。之後我可以用一個正則表達式來做到這一點,但我認爲這只是一個參數,有些我可以翻轉。請參閱澄清編輯。 – Joe 2009-10-21 16:17:25

回答

3

在您的輸入文檔中,<innerTag>具有邏輯名稱空間"http://xyz",因爲其父代<outerTag>元素具有該名稱空間。這就是XML名稱空間的工作方式。

當你問它自己的<innerTag>元素,斯卡拉副本來自父<outerTag>命名空間聲明,因爲命名空間是<innerTag>的邏輯部分,即使它沒有在初始文件中明確說明。

如果你想刪除命名空間,你將不得不執行一些額外的處理來做到這一點。

+0

謝謝。我推斷類似的情況是這樣的。考慮到%是Elem的成員而不是Node(這是我正在處理的),如何處理它的任何想法? – Joe 2009-10-21 15:42:30

+0

對不起,我的斯卡拉有點生鏽 – skaffman 2009-10-21 15:55:58

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, [email protected] _*) => 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

使用和Elem.copy()Scala中的2.8.0:

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> 
+0

'錯誤:值副本不是scala.xml.Elem的成員' 使用最新的Scala。奇怪... – Joe 2009-10-21 17:03:21

+0

@Joe複製方法被添加到Elem在修訂18757是4個星期前。如果你每晚使用最新的,你一定會看到它。 – 2009-10-21 17:31:33

+0

啊不,我有穩定版本(2.7.6)。我明天晚上再試一次。謝謝! – Joe 2009-10-21 18:19:08

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))} 
相關問題