Thank you Tom!

Exactly was I was looking for!

I will TRY to add some documentation to clojuredocs.org just so people
won't be that afraid, this xml-functionality is a very sane way of doing
it, it's just takes a while to get used to it (I'll check that it's refered
to the correct namespace as well).

I guess next step would be making a clojar avaliable, but I have no clue on
how to do that yet.

/Linus

2011/12/13 Tom Faulhaber <tomfaulha...@gmail.com>

> 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

-- 
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