MTSZ правильно, это просто, как это делается в Scala Xml. Если вы открыты для альтернатив, то Scales предоставляет прямой синтаксис xpath (и строку, основанную на Jaxen) и сопоставление с образцом по атрибутам:
import scales.utils._
import ScalesUtils._
import scales.xml._
import ScalesXml._
import TextFunctions.value
val xml =
(<countries>
<country isoCode="AU">Australia</country>
<country isoCode="GB">Great Britain</country>
</countries>).asScales.rootElem
val couldContainAU = top(xml). *("countries").
\*("country").
\@{ a => a.name == ("isoCode"l) && a.value == "AU"}.\^
couldContainAU.foreach{ country => println( "got " + value(country) ) }
// or collect all isoCodes via pattern matching
val IsoMatcher = ElemMatcher("country", "isoCode")
for{ countries <- top(xml) * "countries"
country <- countries \* "country"
} elem(country) match {
case IsoMatcher(elem, Attr(iso) :: Nil) => println(iso+" => "+value(country))
case _ => println("oops")
}
NB
\@{ a => a.name == ("isoCode"l) && a.value == "AU"}
будет возможно через
\@("isoCode") .*@(_.value == "AU")
и в следующем RC.