OK, this is stumping both me (rookie at Scala) as well as my colleague (more advanced at Scala). Scala 2.8.0. Here's a demonstration of the problem:
// I've got a var with some XML in it
scala> qq2
res9: scala.xml.Elem = <a><a1>A1</a1><bs><b>B1</b><c>C1</c><d>D1</d></bs></a>
// I can extract sub-elements
scala> (qq2 \ "bs")
res10: scala.xml.NodeSeq = NodeSeq(<bs><b>B1</b><c>C1</c><d>D1</d></bs>)
// but if I try to match against this NodeSeq, it fails to match
scala> (qq2 \ "bs") match {case <bs>{x @ _*}</bs> =>
for (xx <- x) println("matched " + xx) }
scala.MatchError: <bs><b>B1</b><c>C1</c><d>D1</d></bs>
at .<init>(<console>:7)
at ...
// but if I just type in the XML directly, it works as expected
scala> <bs><b>B1</b><c>C1</c><d>D1</d></bs> match {
case <bs>{x @ _*}</bs> => for (xx <- x) println("matched " + xx) }
matched <b>B1</b>
matched <c>C1</c>
matched <d>D1</d>
// presumably because it's of type Elem, not NodeSeq
scala> <bs><b>B1</b><c>C1</c><d>D1</d></bs>
res13: scala.xml.Elem = <bs><b>B1</b><c>C1</c><d>D1</d></bs>
So, two questions. One: wtf? Why is it like this? Two: I can't seem to find a way to convert a NodeSeq to an Elem, so that match will work. What's the right way to do this?