Ich versuche, einen SAX-Parser für ein XHTML-Dokument zu schreiben, das ich aus dem Internet herunterladen. Auf den ersten (fand ich von here heraus, dass es war, weil W3C absichtlich Zugriff auf die DTD blockiert) Ich war ein Problem mit der Doctype Deklaration zu haben, aber ich festgelegt, dass mit:Java - SAX-Parser auf einem XHTML-Dokument
XMLReader reader = parser.getXMLReader();
reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
aber jetzt bin ich ein zweites Problem erleben. Der SAX-Parser wirft eine Ausnahme, wenn es einige Javascript eingebettet in das Dokument XHTML erreicht:
<script type="text/javascript" language="JavaScript">
function checkForm() {
answer = true;
if (siw && siw.selectingSomething)
answer = false;
return answer;
}//
</script>
Insbesondere der Parser einen Fehler wirft, sobald sie die & & ‚s erreicht, wie es eine Entity-Referenz ist zu erwarten. Die genaue Ausnahme ist:
`org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:391)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1390)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEntityReference(XMLDocumentFragmentScannerImpl.java:1814)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3000)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:624)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:486)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:810)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:740)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:110)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1208)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:525)
at MLIAParser.readPage(MLIAParser.java:55)
at MLIAParser.main(MLIAParser.java:75)`
Ich vermute (aber ich weiß nicht), dass, wenn ich nicht die DTD deaktiviert hatte, dann würde ich nicht diesen Fehler. Also, wie kann ich den DTD-Fehler vermeiden und den Entity-Referenzfehler vermeiden?
Cheers,
Pete
Anstatt die DTD zu deaktivieren, habe ich sie heruntergeladen und sie als eingebettete Ressource in meine Software eingefügt. Wenn der Parser das will, gebe ich ihm meine lokale/heruntergeladene/zwischengespeicherte Kopie der DTD, anstatt sie aus dem Internet zu holen. Das ist besser, als die DTD-Verarbeitung komplett zu deaktivieren. – ChrisW