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

+0

Просто личное предпочтение. Я обнаружил, что (вообще) неявки не понятны и/или могут быть трудноразрешимы при просмотре новой кодовой базы. Этот особый стиль, то есть «объект сутенерства», делая сайт приложения очень опрятным, просто немного неясен/магии для моего вкуса. Если это мой код, я бы просто * явно * обернул 'body' в' new ExtendedNode'. – millhouse

+0

Получил ваш момент, и, кроме некоторого особого случая, я согласен, что вы это заметили. спасибо – Chosmos

Смежные вопросы