Учитывая следующие элементы XML --
val nodes = List(
<foo/>,
<bar/>,
<baz/>,
<bar>qux</bar>,
<bar quux="corge"/>,
<bar quux="grauply">waldo</bar>,
<bar quux="fred"></bar>
)
-- как создать шаблон, который соответствует всем <bar/>
? Я пробовал, например:
nodes flatMap (_ match {
case b @ <bar/> => Some(b)
case _ => None
})
но это соответствует только пустым.
res17: List[scala.xml.Elem] = List(<bar/>, <bar quux="corge"/>, <bar quux="fred"></bar>)
И если я разрешаю заполнитель для контента:
nodes flatMap (_ match {
case b @ <bar>{content}</bar> => Some(b)
case _ => None
})
это соответствует только непустым файлам.
res20: List[scala.xml.Elem] = List(<bar>qux</bar>, <bar quux="grauply">waldo</bar>)
Конечно, я мог бы отказаться от XML-литералов и просто написать
nodes flatMap (_ match {
case e: Elem if e.label == "bar" => Some(e)
case _ => None
})
но похоже, что должен быть более умный способ.