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

scala – XML插入/更新

发布时间:2020-12-16 09:26:40 所属栏目:安全 来源:网络整理
导读:你知道根据XPath插入和(或)更新节点的任何Scala API吗?例如,对于给定的Node和XPath,此API将使用新节点创建XML副本 谢谢 解决方法 您可以使用RewriteRule执行此操作,2.10.3 documentation. val cats = Cats Cat Name="Floyd"/ Cat Name="Onyx"//Cats 然后假
你知道根据XPath插入和(或)更新节点的任何Scala API吗?例如,对于给定的Node和XPath,此API将使用新节点创建XML副本

谢谢

解决方法

您可以使用RewriteRule执行此操作,2.10.3 documentation.

val cats = <Cats>
  <Cat Name="Floyd"/>
  <Cat Name="Onyx"/>
</Cats>

然后假设RewriteRule

class AddCat(name: String) extends RewriteRule {
   override def transform(n: Node): Seq[Node] = n match {
     case e: Elem if e.label == "Cats" =>
       val cats = (e  "Cat")
       val newCat = <Cat Name={name}/>
       new Elem(e.prefix,"Cats",e.attributes,e.scope,e.minimizeEmpty,(cats ++ newCat).toSeq:_*)
     case x => x
   }
 }

然后你可以做到,

val rule = new RuleTransformer(new AddCat("Stevie"))
rule.transform(cats)
res2: Seq[scala.xml.Node] = List(<Cats><Cat Name="Floyd"/><Cat Name="Onyx"/><Cat Name="Stevie"/></Cats>)

同样,如果您想要更改属性

class AddLastName(name: String,lastName: String) extends RewriteRule {
  override def transform(n: Node): Seq[Node] = n match {
    case e: Elem if e.label == "Cat" && (e  "@Name" text).equals(name) =>
      val cat: String = e.attributes("Name").head.text
      e % Attribute(None,"Name",Text(s"$name $lastName"),Null)
    case x => x
  }
}

val rule = new RuleTransformer(new AddLastName("Stevie","Nicks"))
rule.transform(cats)
res3: Seq[scala.xml.Node] = List(<Cats><Cat Name="Floyd"/><Cat Name="Onyx"/><Cat Name="Stevie Nicks"/></Cats>)

这两种方法都可以满足您的需求.困难的部分是弄清楚如何到达孩子,然后建立父节点.

(编辑:李大同)

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

    推荐文章
      热点阅读