Извлечение узлов только тогда, когда они имеют определенные атрибуты с конкретными значениями - PullRequest
1 голос
/ 22 декабря 2009

Основываясь на этом этом посте , я нуждался в чистом способе извлечения узлов в для понимания, только если они имели определенные значения атрибутов. Вот что я придумал:

def attributeValue(attrs: (String, String)*)(n: Node) = 
  attrs.map { p =>
    n.attribute(p._1).exists(_ == p._2)
  } reduceLeft(_ && _)

А вот пример, который использует его для извлечения объектов предметов из канала атома.

def parseAtomItems(ns: NodeSeq) = ns \\ "entry" flatMap { i =>
  for(
    t <- i \ "title";
    l <- i.\("link").filter(attributeValue(
        "type"  -> "text/html",
        "rel"   -> "alternate"
        ).flatMap(_.attribute("href"))
    ) yield FeedItem(t text, l text)
}

Мой вопрос: есть ли более чистый / более идиоматический способ реализации attributeValue?

1 Ответ

2 голосов
/ 22 декабря 2009

Я думаю, что код довольно хорош, на самом деле. Я бы сделал это:

def attributeValue(attrs: (String, String)*)(n: Node) =   
  attrs forall { 
    case (key, value) => n attribute key exists (_ == value)
  }

С другой стороны,

def attributeValue(attrs: (String, String)*)(n: Node) =   
  attrs forall { 
    case (key, value) => n \ ("@"+key) exists (_ == value)
  }

Основным преимуществом forall над reduceLeft является то, что первый остановится на первом ложном результате, а второй будет повторяться по каждой паре ключ / значение, даже если ложное совпадение гарантировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...