You have also to declare withSubstDTDEntities no
, i. e.
runX $ readDocument [withValidate no, withSubstDTDEntities no] "example.xml"
Explanation: The default for this config is yes and I guess that's why hxt tries to download the dtd file. From the documentation:
Switching this option and the validation off can lead to faster parsing, in that case reading the DTD documents is not longer necessary.