clojure и XML transformation
Mar. 4th, 2013 08:00 pmПопробовал zippers. Задача — поменять все <delta value="XXX"> на <delta value="0">:
Всё хорошо, но непонятно, что можно вернуть из функции, чтобы можно было аналогичную звать дальшe:
Переписал на data.xml с рекурсивным беганием map-ами по :content. Омерзительно. В недоумении.
Upd: славааллаху опенсорсу, я таки посмотрел в исходники clojure.zip. Они держат сопутствующие структуры в метаданных. Убиться веником.
Upd2: работает вот так, но недоумение остаётся:
(defn- zero-deltas [zip] (loop [loc zip] (if (zip/end? loc) loc (recur (zip/next (if (= (:tag (zip/node loc)) :delta) (zip/edit loc #(assoc-in % [:attrs :value] "0")) loc))))))
Всё хорошо, но непонятно, что можно вернуть из функции, чтобы можно было аналогичную звать дальшe:
(-> filename parse xml-zip zero-deltas something-else)
Переписал на data.xml с рекурсивным беганием map-ами по :content. Омерзительно. В недоумении.
Upd: слава
Upd2: работает вот так, но недоумение остаётся:
(if (zip/end? loc) (with-meta (vector (zip/root loc) nil) (meta zip))