2010-05-07 29 views
8

Giả sử, tôi đang phân tích cú pháp nguồn cấp dữ liệu RSS và muốn trích xuất một tập hợp con thông tin từ nó.Cách thành ngữ để xây dựng cấu trúc tùy chỉnh từ dây kéo XML trong Clojure

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

tôi có thể nhận được các liên kết và các chức danh riêng:

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

Tuy nhiên tôi không thể tìm ra cách để trích xuất chúng cùng một lúc mà không đi qua các dây kéo nhiều hơn một lần, ví dụ

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

... hoặc một biến thể của nó, liên quan đến việc lập bản đồ nhiều chuỗi để một chức năng mà từng bước xây dựng một bản đồ với, nói, assoc.

Không chỉ tôi phải đi qua chuỗi nhiều lần, các chuỗi cũng có trạng thái riêng biệt, vì vậy các phần tử phải được "căn chỉnh", để nói. Tức là, trong một trường hợp phức tạp hơn RSS, một phần tử con có thể bị thiếu trong phần tử cụ thể, làm cho một chuỗi ngắn hơn một (không có khoảng trống). Vì vậy, kết quả có thể thực sự không chính xác.

Có cách nào hay hơn, trên thực tế, cách bạn làm điều đó ở Clojure?

Trả lời

3

Điều này thì sao?

(reduce (fn [h item] 
      (assoc h (xml1-> item :title text) 
        (xml1-> item :link text))) 
     {} (xml-> feed :channel :item)) 
Các vấn đề liên quan