2014-11-23 46 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

相關問題