加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – Scala:修改NodeSeq

发布时间:2020-12-16 23:36:04 所属栏目:百科 来源:网络整理
导读:我有这样的NodeSeq: FOO baz bar key1 =“value1”key2 =“value2” foobar / bar / baz 等等等等等等 bar key1 =“value3” barfoo / bar /富 我想为所有栏的属性添加一个新属性.我现在正在做: val rule = new RewriteRule() { override def transform(no
我有这样的NodeSeq:

< FOO>
< baz>< bar key1 =“value1”key2 =“value2”> foobar< / bar>< / baz>
等等等等等等
< bar key1 =“value3”> barfoo< / bar>
< /富>

我想为所有栏的属性添加一个新属性.我现在正在做:

val rule = new RewriteRule() {
     override def transform(node: Node): Seq[Node] = {
       node match {
          case Elem(prefix,"bar",attribs,scope,content@_*)  => Elem(prefix,attribs append Attribute(None,"newKey",Text("newValue"),scala.xml.Null),content:_*)
          case other => other
       }
     }
   }

但问题是它只适用于1个节点.我希望它以递归方式处理所有节点,如果我在for循环中调用转换,我不能用新值替换它们,因为它们变得不可变.我怎么解决这个问题?

解决方法

以下是您自己的解决方案的简化版本(使用Daniel的匹配逻辑变体):

def updateBar(node: Node): Node = node match {
    case elem @ Elem(_,_,child @ _*) => elem.asInstanceOf[Elem] % Attribute(None,Null) copy(child = child map updateBar)
    case elem @ Elem(_,child @ _*) => elem.asInstanceOf[Elem].copy(child = child map updateBar)
    case other => other
}

请注意,这与原始代码之间的主要区别在于,这个与外部处理节点,如此处所示,我在第一个答案中添加了一些打印语句:

scala> updateBar(<foo><bar>blabla</bar></foo>)
processing '<foo><bar>blabla</bar></foo>'
processing '<bar>blabla</bar>'
processing 'blabla'
result: 'blabla'
result: '<bar newKey="newValue">blabla</bar>'
result: '<foo><bar newKey="newValue">blabla</bar></foo>'
res1: scala.xml.Node = <foo><bar newKey="newValue">blabla</bar></foo>

虽然您的原始代码从内到外工作(简化示例):

scala> xf { <a><b><c/></b></a> }
transforming '<c></c>'
result: '<c></c>'
transforming '<b><c></c></b>'
result: '<b><c></c></b>'
transforming '<a><b><c></c></b></a>'
result: '<a><b><c></c></b></a>'
res4: scala.xml.Node = <a><b><c></c></b></a>

有可能这两种技术会产生不同的结果.

另一个区别是匹配代码稍微冗长:你需要一个案例来实际转换相关元素,还有一个案例用于递归处理子节点.但是,显示的示例可能会稍微重构一下.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读