0
body \\ "div"
匹配「div」標籤,body \\ "p"
匹配「p」標籤。我可以告訴scala.xml匹配任何兩個標籤嗎?
但是如果我想匹配所有的「div」和「p」標籤呢? scala.xml中有一個表達式可能嗎?
如果沒有,是否有另一種方法可以按照它們出現的順序遍歷文檔中的所有「div」和「p」標籤?
body \\ "div"
匹配「div」標籤,body \\ "p"
匹配「p」標籤。我可以告訴scala.xml匹配任何兩個標籤嗎?
但是如果我想匹配所有的「div」和「p」標籤呢? scala.xml中有一個表達式可能嗎?
如果沒有,是否有另一種方法可以按照它們出現的順序遍歷文檔中的所有「div」和「p」標籤?
如果你看看來源爲\\
在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")
但我必須說,我不知道我喜歡兩種方法名或使用隱含在這裏:-(
請,可以喲解釋你爲什麼不喜歡在這裏使用隱式? – Chosmos 2014-11-23 07:49:09
只是個人喜好。我發現(通常而言)隱含的內容在瀏覽新的代碼庫時不易理解和/或難以推理。這種特殊的風格,即「對象皮條」,同時使得應用程序網站非常整潔,對我的口味來說太過晦澀難懂。如果這是我的代碼,那麼我可能會明確地將'body'包裝在'New ExtendedNode'中。 – millhouse 2014-11-23 21:33:29
明白了你的觀點,除了一些特殊情況外,我現在同意你的評論。謝謝 – Chosmos 2014-11-24 11:00:11