0

Scalaに似た問題があります - xml でネストされた要素を変更する この投稿で同じコードを再現しました。要素のコンテンツを変更しようとしていますが、関数を呼び出してコンテンツを取得する必要があります。たとえば。

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>本当にうまくいかないものを探すようなパターンマッチで囲んでみました。
助言がありますか ?

4

1 に答える 1

0

これを修正しました。この問題はhttps://github.com/scala/scala-xml/issues/58で対処されています

この修正は 2.12-M3 (現在) バージョンの scala で利用できますが、私のように 2.11 バージョンの scala を使用する人は、クラスの変換メソッドをオーバーライドして、次のコードを貼り付けることができます。

 def transform(ns: Seq[Node]): Seq[Node] = {
    val changed = ns flatMap transform
    if (changed.length != ns.length || (changed, ns).zipped.exists(_ != _)) changed
else ns
}
于 2016-02-01T23:23:01.750 に答える