scala-XML插入/更新

scala-XML插入/更新,xml,scala,xpath,insert,Xml,Scala,Xpath,Insert,您知道根据XPath插入和(或)更新节点的Scala API吗?e、 g对于给定的节点和XPath,此API将使用新节点创建XML的副本 谢谢我要做的就是使用\\ 使用.toList.last.text 附加我需要的内容,然后收集我的选项:jsonOption collect在这里,您可以使用orElse some再次更改一些选项,然后最后使用for yield生成我想要的xml 利用scale在数据转换中的灵活性。它不必完全相同,但我相信您可以看到灯光…您可以使用重写规则来执行此操作 那你就可

您知道根据XPath插入和(或)更新节点的Scala API吗?e、 g对于给定的节点和XPath,此API将使用新节点创建XML的副本


谢谢

我要做的就是使用
\\

使用
.toList.last.text

附加我需要的内容,然后收集我的选项:
jsonOption collect
在这里,您可以使用
orElse some
再次更改一些选项,然后最后使用
for yield
生成我想要的xml


利用scale在数据转换中的灵活性。它不必完全相同,但我相信您可以看到灯光…

您可以使用
重写规则来执行此操作

那你就可以

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>)
val rule=new RuleTransformer(new AddCat(“Stevie”))
规则转换(猫)
res2:Seq[scala.xml.Node]=List()
类似地,如果要更改属性

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>)
class AddLastName(name:String,lastName:String)扩展了重写规则{
覆盖def转换(n:Node):Seq[Node]=n匹配{
案例e:如果e.label==“Cat”&&(e\\“@Name”文本)等于(Name)=>
val cat:String=e.attributes(“Name”).head.text
e%属性(无,“名称”,文本“$Name$lastName”),Null)
案例x=>x
}
}
val规则=新规则转换器(新AddLastName(“Stevie”、“Nicks”))
规则转换(猫)
res3:Seq[scala.xml.Node]=List()

这两种方法都能满足您的需求。困难的部分是找出如何获取子节点,然后构建父节点。

Xpath是一种查询语言。据我所知,你不能用它更新或写作。您的意思是xslt吗?XPath将用于“选择”一个节点,并提供一个将作为子节点添加到此“父”节点的节点。顺便说一句,我知道Scala XML是不可变的,但有没有任何可能的方法,如何完成这个任务?那个问题呢?它展示了如何用scala xml更新节点……在scala的xml库中,节点不指向它们的父节点,这使得您描述的这类事情很棘手。该库通过以下方式提供此功能:使用类似XPath的运算符导航到文档中,进行编辑,然后
取消选择
以获取已编辑的文档。例如,请参见。@TravisBrown:这可能是答案吗?那么这个问题就不会被归类为“未回答”。这是最好的答案之一。我不敢相信它没有得到更多的选票,也没有被标记为正确。我看了很多其他人,但这是最有帮助的。非常感谢@tysonjh。
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>)