2010-05-07 2 views
8

말하기, 나는 RSS 피드를 파싱 중이며 그로부터 정보의 하위 집합을 추출하려고합니다.Clojure에서 XML 지퍼로 사용자 정의 구조를 구현하는 관용적 인 방법

(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에서하는 방법이 있습니까?

답변

3

어떨까요?

(reduce (fn [h item] 
      (assoc h (xml1-> item :title text) 
        (xml1-> item :link text))) 
     {} (xml-> feed :channel :item)) 
관련 문제