これがうまくいくかどうかを確認してください:
object TestXml {
def main(args: Array[String]) {
val xml =
<root>
<here>
<dealID>foo</dealID>
</here>
</root>
println(insertRefIntoXml(2, xml))
}
def insertRefIntoXml(ref: Int, entry: Node): Node = {
def doInsertRef(n:Node):Node = {
n match {
case <root>{ mainRoot @ _* }</root> => <root>{ mainRoot.map(doInsertRef)}</root>
case <here><dealID>{ contents }</dealID></here> => <here><dealID>{ ref }</dealID></here>
case other @ _ => other
}
}
doInsertRef(scala.xml.Utility.trim(entry))
}
}
いくつかの問題がありました。まず、insertRefIntoXml
の呼び出しでmap
希望どおりに使用するには、2 つではなく 1 つの引数のみが必要です。これを修正するために、ローカル関数 def を作成しref
、そこからクロージャーを介して値を取得しました。代わりに、この問題を次のように解決することもできます。
def insertRefIntoXml(ref: Int, entry: Node): Node = {
entry match {
case <root>{ mainRoot @ _* }</root> => <root>{ mainRoot.map(insertRefIntoXml(ref, _))}</root>
case <here><dealID>{ contents }</dealID></here> => <here><dealID>{ ref }</dealID></here>
case other @ _ => other
}
}
そして、次のように呼び出します。
insertRefIntoXml(2, scala.xml.Utility.trim(xml))
それが私を2番目の問題に導きます。match ステートメントが正しく一致するようにトリミングしています。コードを実行すると、希望する出力が得られると思います。