это работает:
<a>apple</a> node match { case <a>{contents}</a> => "It's an a: "+ contents case _ => "It's something else." }
как мне изменить этот пример, чтобы он соответствовал только узлу с тегом "a" и атрибутом id = 2: что-то вроде следующего:
<a id="2">apple</a> node match { case <a id="2">{contents}</a> => "It's an a: "+ contents case _ => "It's something else." }
но это не компилируется.
Еще один способ, просто ради этого.
<a id="2">apple</a> match { case Node("a", Attribute("id", Text("2"), _), Text(contents)) => contents }
Хотя не работает для нескольких атрибутов.
Вот один из способов сделать это:
node match { case a @ <a>{contents}</a> if (a \ "@id").text == "2" => "It's an a: " + contents case _ => "It's something else." }
Похоже, вам нужна полная поддержка XPath для написания запросов типа "a [id = '2']"
Scala Scales - один из доступных вариантов.
Но в дополнение к ответу Филиппа я могу предложить этот запрос
import scala.xml.Text val node = <a id="2">apple</a> (node \\"a" \"@id").text match { case "2" => "It's an a: "+ (node \\"a").text case _ => "It's something else." }