2014-11-23 48 views
0

body \\ "div"匹配“div”标签,body \\ "p"匹配“p”标签。我可以告诉scala.xml匹配任何两个标签吗?

但是如果我想匹配所有的“div”和“p”标签呢? scala.xml中有一个表达式可能吗?

如果没有,是否有另一种方法可以按照它们出现的顺序遍历文档中的所有“div”和“p”标签?

回答

3

如果你看看来源为\\NodeSeq.scala你可以看到,它实际上只是一个为filter工作在descendant_or_self,这是一个List[Node]加点糖,使用节点的label

所以,你可以自己做同样的事情,对一个相匹配地设置标签,像这样:

val searchedLabels = Set("p", "div") 

val results = body.descendant_or_self.filter(node => searchedLabels.contains(node.label)) 

或者,如果你真的希望它看起来像“内置”功能,你可以皮条客,在一个合适的方法来scala.xml.Node像这样:

class ExtendedNode(n: Node) { 

    def \\\(labels: Set[String]): NodeSeq = { 
    n.descendant_or_self.filter(node => labels.contains(node.label)) 
    } 
} 

implicit def node2extendedNode(n: Node): ExtendedNode = new ExtendedNode(n) 

val results = body \\\ Set("p", "div") 

但我必须说,我不知道我喜欢两种方法名或使用隐含在这里:-(

+0

请,可以哟解释你为什么不喜欢在这里使用隐式? – Chosmos 2014-11-23 07:49:09

+0

只是个人喜好。我发现(通常而言)隐含的内容在浏览新的代码库时不易理解和/或难以推理。这种特殊的风格,即“对象皮条”,同时使得应用程序网站非常整洁,对我的口味来说太过晦涩难懂。如果这是我的代码,那么我可能会明确地将'body'包装在'New ExtendedNode'中。 – millhouse 2014-11-23 21:33:29

+0

明白了你的观点,除了一些特殊情况外,我现在同意你的评论。谢谢 – Chosmos 2014-11-24 11:00:11

相关问题