给定以下 XML 元素——
val nodes = List(
<foo/>,
<bar/>,
<baz/>,
<bar>qux</bar>,
<bar quux="corge"/>,
<bar quux="grauply">waldo</bar>,
<bar quux="fred"></bar>
)
-- 如何构造一个匹配所有<bar/>
s 的模式?我试过了,例如:
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
})
但似乎必须有更聪明的方法。