Hi Linus,

Zippers and their associated helpers are woefully undocumented, so I'm
not surprised you fell into the swamp.

I think that the help you're looking for can be found in the
clojure.data contrib project (see https://github.com/clojure/data.zip
for the source and http://clojure.github.com/data.zip for the
autodoc).

Using that, the xpathy thing you're looking for is something like
this:

(ns play.xml-example
  (:require [clojure.zip :as zip]
            [clojure.data.zip :as zf]
            [clojure.xml :as xml])
  (:use clojure.data.zip.xml))

(def mz (zip/xml-zip (xml/parse "dataabove.xml")))

(defn get-all-dimensions []
  (doseq [id (xml-> mz zf/descendants (attr= :id "2") zf/children :e
(attr :id))]
    (println (apply str id))))


Note that I had to make a couple of fixes to the above XML to make it
right.

I hope that's useful!

Tom

On Dec 12, 7:06 am, Linus Ericsson <oscarlinuserics...@gmail.com>
wrote:
> Hello!
>
> What's the clever way to read the E-tags "thisone" and "andthis" in the
> XML-file below given I don't know their id on beforehand?
>
> <a>
>   <b>bla bla</b>
>   <b>bla bla</b>
>   <c id="wanted">
>     <d id="1">
>       <e id="notthisone"/></d>
>     <d id="2">
>       <e id="thisone"/>
>       <e id="andthis"/></d>
>    <d id="3">
>       <e id="not-intresting"></d>
> </a>
>
> My solution so far would be something like
>
> (def mz (zip/xml-zip (xml/parse "dataabove.xml")))
>
> (defn get-all-dimensions []
>   (filter #(and (= "2" (:id %)) (= :e (:tag %))) (zip/children mz))))
>
> but I'm looking for some descending solution
>
> (-> mz
>       (zip/down a)
>       (zip/down c :where (= :id "wanted"))
>       (zip/down d :where (= :id 2))
>       zip/children)
>
> (an xpath-like solution would most awesome)
>
> According to it's own page Enlive is not very good for xml and I cannot
> figure out the way to dynamically walk with zippers (like "go into the tag
> :d with id=..."). Would Enlive work for my needs here?
>
> When I got this sorted out I will try my best to add some examples on
> clojuredocs.org, zippers is good but I don't know if it's for everything.
>
> /Linus

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to