Я пытаюсь получить тег узла 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>
тег?
Итак, если я вас правильно понял:
nucleic-acid-sequence
младше substance-classes
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, и может выглядеть примерно так:
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
не потеряны, и ваша функция сохранила два узла вместо четырех для определенного условия.
Надеюсь, поможет.