gpt4 book ai didi

xml - Scala 如何检索带有可选属性的 xml 标签

转载 作者:数据小太阳 更新时间:2023-10-29 02:38:23 24 4
gpt4 key购买 nike

我正在尝试获取带有属性的 scala xml 节点标记。我只想获取带有属性的标签名称,而不是子元素。

我有这个输入:

<substance-classes>
<nucleic-acid-sequence display-name="Nucleic Acid Sequence">
<nucleic-acid-base>
<base-symbol>a</base-symbol>
<count>295</count>
</nucleic-acid-base>
<nucleic-acid-base>
<base-symbol>c</base-symbol>
<count>329</count>
</nucleic-acid-base>
<nucleic-acid-base>
<base-symbol>g</base-symbol>
<count>334</count>
</nucleic-acid-base>
<nucleic-acid-base>
<base-symbol>t</base-symbol>
<count>268</count>
</nucleic-acid-base>
</nucleic-acid-sequence>
<genbank-information>
<genbank-accession-number>EU186063</genbank-accession-number>
</genbank-information>
</substance-classes>

我正在尝试替换 <nucleic-acid-sequence> 的内容通过这样做

val newNucleicAcidSequenceNode = <nucleic-acid-sequence>{ myfunction 
} </nucleic-acid-sequence>

但是有些<nucleic-acid-sequence>具有类似 <nucleic-acid-
sequence display-name="Nucleic Acid Sequence">
的属性.自从我的 newNucleicAcidSequenceNode是一个硬编码标签我正在失去属性。

如何保留可选属性并仍然通过 { myfunction }<nucleic-acid-sequence>标签?

最佳答案

所以,如果我理解得很好的话:

  • 您只想替换 xml 的一部分
  • 这部分是 substance-classes 下任何 nucleic-acid-sequence 的 child
  • 您不想丢失任何上述nucleic-acid-sequence的任何属性
  • 更改上述这些子项是通过函数 (myFunction) 完成的

所以在那种情况下我的回答是:

import scala.xml.{Node, Elem}

val myXml: Elem =
<substance-classes>
<nucleic-acid-sequence display-name="Nucleic Acid Sequence">
<nucleic-acid-base>
<base-symbol>a</base-symbol>
<count>295</count>
</nucleic-acid-base>
<nucleic-acid-base>
<base-symbol>c</base-symbol>
<count>329</count>
</nucleic-acid-base>
<nucleic-acid-base>
<base-symbol>g</base-symbol>
<count>334</count>
</nucleic-acid-base>
<nucleic-acid-base>
<base-symbol>t</base-symbol>
<count>268</count>
</nucleic-acid-base>
</nucleic-acid-sequence>
<genbank-information>
<genbank-accession-number>EU186063</genbank-accession-number>
</genbank-information>
</substance-classes>

def myFunction(children: Seq[Node]) : Seq[Node] = ??? // whatever you want it to be

// Here's the replacement:

myXml.copy(child = myXml.child.map {
case e@Elem(_, "nucleic-acid-sequence", _, _, children@_*) =>
e.asInstanceOf[Elem].copy(child = myFunction(children))
case other => other
})

例如,myFunction 可以只保留计数超过 300 的 child ,并且可能是这样的:

import scala.util.{ Try, Success }
def myFunction(children: Seq[Node]): Seq[Node] = children.collect {
case e: Node if Try((e \ "count").text.toInt > 300) == Success(true) =>
e
}

在这种情况下,如果您将第一个代码段中未实现的 myFunction 替换为此,替换将给出:

  <substance-classes>
<nucleic-acid-sequence display-name="Nucleic Acid Sequence"><nucleic-acid-base>
<base-symbol>c</base-symbol>
<count>329</count>
</nucleic-acid-base><nucleic-acid-base>
<base-symbol>g</base-symbol>
<count>334</count>
</nucleic-acid-base></nucleic-acid-sequence>
<genbank-information>
<genbank-accession-number>EU186063</genbank-accession-number>
</genbank-information>
</substance-classes>

如您所见,nucleic-acid-sequence 的任何属性都没有丢失,并且您的函数在定义的条件下保留了四个以上的两个节点。

希望对您有所帮助。

关于xml - Scala 如何检索带有可选属性的 xml 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55616496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com