带有空格的Scala XML模式

时间:2012-01-03 11:26:02

标签: xml scala pattern-matching

xml的值是否与以下模式匹配?

xml match { case <foo> { x } </foo> => 42 }

1 个答案:

答案 0 :(得分:5)

scala> val x = 33
x: Int = 33

scala> val xml = <foo> { x } </foo>
xml: scala.xml.Elem = <foo> 33 </foo>

scala> xml match { case <foo> { x } </foo> => 42 }
res0: Int = 42

我认为你的困惑在于它与<foo> 33 </foo>

不匹配
scala> <foo> 33 </foo> match { case <foo> { x } </foo> => 42 }
scala.MatchError: <foo> 33 </foo> (of class scala.xml.Elem)

这是因为当您使用{}时,scala会为{}之前和之后的空格插入额外的元素,因此您将获得三个元素,而不是一个元素。您可以通过调用unapplySeq(这是用于模式匹配的内容)来看到这一点:

scala> scala.xml.Elem.unapplySeq(<foo> 33 </foo>)
res4: Option[(String, String, scala.xml.MetaData, scala.xml.NamespaceBinding, Seq[scala.xml.Node])] =
    Some((null,foo,,,ArrayBuffer( 33 )))

scala> scala.xml.Elem.unapplySeq(<foo> { x } </foo>)
res5: Option[(String, String, scala.xml.MetaData, scala.xml.NamespaceBinding, Seq[scala.xml.Node])] =
    Some((null,foo,,,ArrayBuffer( , 33,  )))

请注意,在第二个示例中,您在ArrayBuffer中获得了三个元素,而第一个中只有一个元素。所以模式不正确。