ここに 2 つ (今は3つにします) 可能な解決策があります。最初のものはかなり速くて汚いです。Scala インタープリターで全体を実行できます。
val xmlData = <outertag>
<dog>val1</dog>
<cat>val2</cat>
</outertag>
// A very simple way to do this mapping.
def simpleGetNodeValue(x:scala.xml.NodeSeq, tag:String) = (x \\ tag).text
val cat = simpleGetNodeValue(xmlData, "cat")
val dog = simpleGetNodeValue(xmlData, "dog")
cat
「val2」になり、dog
「val1」になります。
いずれかのノードが見つからない場合は、空の文字列が返されることに注意してください。これを回避するか、もう少し慣用的な方法で記述できます。
// A more idiomatic Scala way, even though Scala wouldn't give us nulls.
// This returns an Option[String].
def getNodeValue(x:scala.xml.NodeSeq, tag:String) = {
(x \\ tag).text match {
case "" => None
case x:String => Some(x)
}
}
val cat1 = getNodeValue(xmlData, "cat") getOrElse "No cat found."
val dog1 = getNodeValue(xmlData, "dog") getOrElse "No dog found."
val goat = getNodeValue(xmlData, "goat") getOrElse "No goat found."
cat1
「val2」、dog1
「val1」、goat
「ヤギが見つかりません」になります。
UPDATE : タグ名のリストを取得し、それらの一致を Map[String, String] として返す便利なメソッドがもう 1 つあります。
// Searches for all tags in the List and returns a Map[String, String].
def getNodeValues(x:scala.xml.NodeSeq, tags:List[String]) = {
tags.foldLeft(Map[String, String]()) { (a, b) => a(b) = simpleGetNodeValue(x, b)}
}
val tagsToMatch = List("dog", "cat")
val matchedValues = getNodeValues(xmlData, tagsToMatch)
それを実行すると、matchedValues
になりますMap(dog -> val1, cat -> val2)
。
それが役立つことを願っています!
更新 2 : ダニエルの提案に従って、私は二重バックスラッシュ演算子を使用しています。これは、子要素に降りてきます。これは、XML データセットが進化するにつれて改善される可能性があります。