Идиоматичный способ создания пользовательской структуры из XML-молнии в Clojure - PullRequest
8 голосов
/ 07 мая 2010

Скажем, я разбираю RSS-канал и хочу извлечь из него подмножество информации.

(def feed (-> "http://..." clojure.zip/xml-zip clojure.xml/parse))

Я могу получить ссылки и заголовки отдельно:

(xml-> feed :channel :item :link text)
(xml-> feed :channel :item :title text)

ОднакоЯ не могу придумать, как извлечь их одновременно, не пересекая молнию более одного раза, например,

(let [feed (-> "http://..." clojure.zip/xml-zip clojure.xml/parse)]
    (zipmap 
        (xml-> feed :channel :item :link text)
        (xml-> feed :channel :item :title text)))

... или их вариации, включая отображение нескольких последовательностей на функцию, котораяПостепенно строит карту, скажем, с assoc.

Мало того, что я должен проходить последовательность несколько раз, последовательности также имеют отдельные состояния, поэтому, так сказать, элементы должны быть «выровнены».То есть в более сложном случае, чем RSS, в конкретном элементе может отсутствовать подэлемент, что делает одну из последовательностей короче на одну (пробелов нет).Таким образом, результат на самом деле может быть неверным.

Есть ли лучший способ или, на самом деле, способ сделать это в Clojure?

1 Ответ

3 голосов
/ 08 мая 2010

Как насчет этого?

(reduce (fn [h item] 
          (assoc h (xml1-> item :title text) 
                   (xml1-> item :link text))) 
        {} (xml-> feed :channel :item))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...