2016-01-28 171 views
0

我有一個類似於 的問題Scala - modifying nested elements in xml 我在這篇文章中轉載了相同的代碼。 我想修改元素中的內容,我必須調用一個函數來獲取內容。例如。修改xml內容scala

object test extends App { 
    val InputXml: Node = 
    <root> 
     <contents> 
     <version>1</version> 
     </contents> 
    </root> 

    object t1 extends RewriteRule { 
    override def transform(n: Node): Seq[Node] = { 
     println("transforming '" + n + "'") 
     n match { 
     case Elem(prefix, "version", attribs, scope, _*) => 
      Elem(prefix, "version", attribs, scope, true, Text(computeVersion())) 

     case other => other 
     } 
    } 

    def computeVersion() = { 
     println("computeVersion called") 
     "3.0" 
    } 
    } 

    object rt1 extends RuleTransformer(t1) 
    val res = rt1(InputXml) 
    val pp = new PrettyPrinter(width = 2, step = 1) 
    Console println (pp format res) 
} 

輸出是:

transforming ' ' 
transforming '1' 
transforming '<version>1</version>' 
computeVersion called 
transforming '<version>1</version>' 
computeVersion called 
transforming '1' 
transforming '<version>1</version>' 
computeVersion called 
transforming '<version>1</version>' 
computeVersion called 
transforming '<contents> <version>3.0</version></contents>' 
transforming ' ' 
transforming '1' 
transforming '<version>1</version>' 
computeVersion called 
transforming '<version>1</version>' 
computeVersion called 
transforming '1' 
transforming '<version>1</version>' 
computeVersion called 
transforming '<version>1</version>' 
computeVersion called 
transforming '<contents> <version>3.0</version></contents>' 
transforming '<root><contents> <version>3.0</version></contents></root>' 
<root><contents> <version>3.0</version></contents></root> 

computeVersion()是越來越幾乎每一次所謂的,因爲複雜。我只希望在處理實際標記時調用它。我試圖通過模式匹配來包圍它,例如搜索<version>,這實際上並不奏效。
有什麼建議嗎?

+0

你能否給出更多的細節,也許可以解釋你接收到的錯誤。 – wwkudu

+0

我已經更新了這個問題。 – user3044440

+0

我看了一下,覺得很困惑。與RewriteRule的方式和改造工作有關,但還沒有時間來解開它。希望有更多知識淵博的人。 – wwkudu

回答

0

我弄明白了。這個問題在https://github.com/scala/scala-xml/issues/58

雖然這個修復程序在2.12-M3(截至今天)版本的scala中可用,但像我這樣使用2.11版本的scala的人可以覆蓋類中的transform方法並粘貼代碼是

def transform(ns: Seq[Node]): Seq[Node] = { 
    val changed = ns flatMap transform 
    if (changed.length != ns.length || (changed, ns).zipped.exists(_ != _)) changed 
else ns 
}