It was my understanding that the stock XML::Parser modules were validating parsers, so, with the presence of a <!DOCTYPE> header (or the explicit parsing of a separate DTD in your code), the XML would be validated as well as parsed.
XML::Parser makes sure that a document is well-formed, but
not necessarily valid. You need something like XML::Checker
for that, which is built on top of XML::Parser, but does the extra validation.