You will have to decide whether you want parsing to conform to standards, going the DTD path, or accept just anything with a permissive parser.
Tagsoup in my experience is fine for the latter and it rarely creates any problems, so I was surprised to read your remark about its handling of "special". A quick test also showed that I could not reproduce it: when running this command
java net.sf.saxon.Query -x:org.ccil.cowan.tagsoup.Parser -s:- -qs:. !encoding=ASCII !indent=yes
on your sample, I received this result
<?xml version="1.0" encoding="ASCII"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:html="http://www.w3.org/1999/xhtml">
<body>
<p>
This is a <span>test</span> with <b>some</b> formattings.<br clear="none"/>
And this has a <ac:special xmlns:ac="urn:x-prefix:ac">special</ac:special> formatting.
</p>
</body>
</html>
from both TagSoup 1.2 and 1.2.1. So for me that behaved as expected, the text "special" appearing inside of the "ac:special" tag.
As for the DTD variant, you could look after going through a caching proxy for resolving the DTD, refer to a local copy, or even reduce the DTD to the bare minimum that you need. The following should be sufficient to get you across the
entity:
<!DOCTYPE DOC[<!ENTITY nbsp " ">]>