使用特定子项创建scala.xml.Elem

时间:2014-10-29 23:30:54

标签: scala

我想基于具有特定子项列表的节点创建新的scala.xml.Elem。 这将是递归替换函数的返回情况。

val childs: Seq[Node] = update(node.child)
new Elem(node.prefix, node.label, node.attributes, node.scope, true, childs)

此构造提供编译器错误:

Error:(50, 11) overloaded method constructor Elem with alternatives:
  (prefix: String,label: String,attributes: scala.xml.MetaData,scope:  scala.xml.NamespaceBinding,child: scala.xml.Node*)scala.xml.Elem <and>
  (prefix: String,label: String,attributes1: scala.xml.MetaData,scope:  scala.xml.NamespaceBinding,minimizeEmpty: Boolean,child: scala.xml.Node*)scala.xml.Elem
  cannot be applied to (String, String, scala.xml.MetaData, scala.xml.NamespaceBinding, Boolean, Seq[scala.xml.Node])
      new Elem(node.prefix, node.label, node.attributes, node.scope, true, childs)
      ^

问题与vararg处理有关,我无法理解为什么会出现此错误。有什么想法吗?

更新 我能够通过以下丑陋的构造解决问题:

val childs: Seq[Node] = update(node.child)
Elem(node.prefix, node.label, node.attributes, node.scope, true)
  .copy(node.prefix, node.label, node.attributes, node.scope, true, childs)

首先创建没有孩子的elem,然后复制并添加孩子。复制方法定义没有varargs。

1 个答案:

答案 0 :(得分:2)

您的scopeminimizeEmpty参数的顺序错误。

尝试像这样调用它(注意我也使用了伴侣对象,保存了几个字符):

Elem(node.prefix, node.label, node.attributes, node.scope, true,  childs)
问题更新后

更新 - 啊现在我看到了您的问题 - childsSeq[Node],但Elem构造函数方法预期Node*;所以你可以使用:

Elem( node.prefix, node.label, node.attributes, node.scope, true,  childs:_* )