xml - 带空格的 Scala XML 模式

标签 xml scala pattern-matching

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

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

最佳答案

是的。

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 中获得了三个元素,而在第一个示例中只有一个。所以模式没有正确匹配。

关于xml - 带空格的 Scala XML 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8711558/

相关文章:

java - catch22 : java pattern matcher regex, 在 '(' 字符处停止

java - 使用 JAXB 解析具有更多子元素的 XML

xml - 使用 Windows 批处理解析 XML 文件

scala - Scala 中带有隐式参数的函数类型

pattern-matching - 为什么在尝试匹配元组时会出现类型不匹配的错误?

java - 通过逗号模式匹配分割

c++ - 有没有一种方便的方法可以从属性树中删除节点,同时保留其子节点?

php - 使用 jquery 从 php 解析 XML

scala - Scala中带有main()和extends App的对象的区别

scala - Spark 在计算大文件时崩溃