2

次の 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
})

しかし、もっと賢い方法があるに違いないようです。

4

1 に答える 1