Scala 如何检索具有可选属性的 xml 标签
Scala how to retrieve xml tag with optional attribute
我正在尝试获取带有属性的 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
的 children
- 你不想失去任何上述的任何属性
nucleic-acid-sequence
- 更改这些上述 children 是通过函数 (
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 的 children,并且可能类似于:
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
的任何属性都没有丢失,并且您的函数在定义的条件下将两个节点保持在四个以上。
希望对您有所帮助。
我正在尝试获取带有属性的 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
- 更改这些上述 children 是通过函数 (
myFunction
)
nucleic-acid-sequence
的 children
所以我的回答是:
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 的 children,并且可能类似于:
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
的任何属性都没有丢失,并且您的函数在定义的条件下将两个节点保持在四个以上。
希望对您有所帮助。