Оживший юзерпик (tobotras) wrote,
Оживший юзерпик
tobotras

Category:

clojure и XML transformation

Попробовал zippers. Задача — поменять все <delta value="XXX"> на <delta value="0">:
(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: слава аллаху опенсорсу, я таки посмотрел в исходники clojure.zip. Они держат сопутствующие структуры в метаданных. Убиться веником.

Upd2: работает вот так, но недоумение остаётся:
  (if (zip/end? loc)
      (with-meta (vector (zip/root loc) nil) (meta zip))
Tags: clojure, печаль, программирование
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 4 comments