Hi All,
I've been teaching myself clojure and in the process am working on a
small program to manipulate an XML file. I figured this was a good
chance to try clojure.zip, but I'm having some difficulty. Being a
newbie I strongly suspected myself - but when I posed the question on
IRC the conclusion was there appears to be a bug.
I boiled it down to the following:
(require ['clojure.xml :as 'xml]
['clojure.zip :as 'zip])
(defn strip [root tag]
(loop [loc root]
(if (zip/end? loc)
(zip/root loc)
(recur (zip/next (if (= (:tag (zip/node loc)) tag)
(zip/remove loc)
loc))))))
(def data "<?xml version=\"1.0\"?><root><foo/><bar/></root>")
(def xml-tree (xml/parse (java.io.ByteArrayInputStream. (.getBytes
data))))
(def zip-root (zip/xml-zip xml-tree))
(xml/emit (strip zip-root :foo))
(xml/emit (strip zip-root :bar))
The first call to strip :foo works as expected, but the following call
to strip :bar throws an NPE within zip/remove. On further inspection
we came clojure/zip.clj:234:
(if (branch? loc)
(recur (-> loc down rightmost))
loc))
According to the docs, branch? can return true for a loc that does not
currently have any children, so the suspicion is that it is an
insufficient test before moving down as happens in the line below. I
can fix this for my simple test cases by replacing the above with:
(if (and (branch? loc) (not (empty? (children loc))))
(recur (-> loc down rightmost))
loc))
Being new to both clojure and zip I admit there's still a good chance
that I have no idea what I'm talking about :).
Cheers,
Jason
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---