次の XML 要素がある場合 --
val nodes = List(
<foo/>,
<bar/>,
<baz/>,
<bar>qux</bar>,
<bar quux="corge"/>,
<bar quux="grauply">waldo</bar>,
<bar quux="fred"></bar>
)
-- すべての s に一致するパターンを作成するにはどうすればよい<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
})
しかし、もっと賢い方法があるに違いないようです。