Because "&" is an entity; "foo&bar" will involve three consecutive calls to the handler. Once for "foo", once for "&" (hence recognising the entity as representing an ampersand), and once for "bar".
So basically you need a buffer. When you start processing the element you're interested in, clear the buffer (just to make sure it's empty). Add what the character data handler returns to the end of this buffer. When you get to the end of the element the contents of the buffer will be the string you're wanting (with, as noted above, "&" replaced by "&").
Since you're reading 8kB at a time (you do mean 8 and not 80, right?🙂) you ought to be doing something like this anyway in case the chunk you just read stops in the middle of something and you have to read the next chunk to see the rest of it.