First attempt at a SVG parser
Ok, here are some things I noticed:

First of all, while the code seems easy enough to follow as it is, a couple of comments here and there certainly couldn't hurt.



tag = do manyTill anyChar . try $ lookAhead tagStart
         char '&lt;'
         name &lt;- many $ noneOf " "


It seems weird that you first use tagStart to find until where to match, but then don't use it to actually match the tag start.



junk = optional . many $ oneOf "\n\r\t\\/"


Since many can already match the empty string, making it optional doesn't change anything.



tagName = string "rect" 
          &lt;|&gt; string "polygon" 
          &lt;|&gt; string "polyline" 
          &lt;|&gt; string "circle" 
          &lt;|&gt; string "path" 
          &lt;|&gt; string "g" 
          &lt;|&gt; string "svg"


That looks a bit repetitive. I'd define a helper function which matches one of a list of strings:

-- Takes a list of strings and returns a Parser which matches any of those strings
oneStringOf = choice . map (try . string)

tagName = oneStringOf ["rect", "polygon", "polyline"] -- etc


By adding the try we also made it so that it actually works correctly now (thanks to Joey Adams for pointing out that fix).



As for why your alternative definition for property doesn't work: I'm not sure whether it's the only thing that keeps it from working, but one mistake is that you wrote tagName when you meant propName.