Found out that there is no need to iterate throught the tree. HXT already does it.
There is a simpler way of constructing data from xml than the naive one I wrote up.
I replaced the entire readMyXml function by :
readMyXml path = do
fi <- readFile path
let
doc = readString [withValidate no] fi
return =<< runX $ getRecipients doc
wrapStr a = if null a
then Nothing
else Just a
getD a = deep (hasName a)
>>> removeAllWhiteSpace
>>> deep getText
getMD a = getD a
>>^ wrapStr
getRecipients doc = doc
>>> deep (hasName "list")
>>> multi (hasName "recipient")
>>> proc y -> do
nime <- getD "name" -< y
lstn <- getD "lastname" -< y
mail <- getD "email" -< y
phon <- getMD "phone" -< y
homi <- getMD "home" -< y
returnA -< Recipient nime lstn mail phon homi
Now the return of getRecipients applied to the doc defined in the question is [Recipient]
Cheers