сопоставление шаблонов scala xml с элементами с одинаковыми именами - PullRequest
1 голос
/ 05 января 2012

предположим, у меня есть следующий xml:

val xml = 
  <countries>
    <country isoCode="AU">Australia</country>
    <country isoCode="GB">Great Britain</country>
  </countries>

Как шаблон сопоставить элемент с isoCode = "AU"? Я придумал только следующее решение:

xml match {
  case <countries>{cs @ _*}</countries> => {
    for(c <- cs) {
      c match {
        case cnode @ <country>{name}</country> if (cnode \ "@isoCode").toString == "AU" => println("I like " + name)
        case _ => Unit
      }
    }
  }
}

Спасибо

1 Ответ

1 голос
/ 08 января 2012

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...