2009-08-16 4 views
0

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

+0

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

Antwort

4

Die (X) HTML Sie ist nicht gültig XML zu analysieren versuchen, (sonst würden Sie nicht einen SAX-Parsing-Fehler bekommen). Und ein Doppel-Ampersand ("&&") bestätigt dies. Das bedeutet, dass Sie keinen einfachen XML-Parser verwenden können, um das Dokument zu analysieren.

Es gibt Werkzeuge, die Sie, wie TagSoup verwenden können, die richtige SAX Ereignisse generieren (Sie die gleiche SAX/XML-Parsing-Code nach wie vor verwenden können), aber tagsoup werden die der Kartierung schlecht geformten HTML Ereignisse kümmern zu korrekten SAX/XML-Ereignissen.

1

Ich glaube, Sie müssen das Skript Inhalt in einem CDATA-Abschnitt setzen, zum Beispiel http://www.w3schools.com/TAGS/tag_script.asp gibt folgendes Beispiel:

<script type="text/javascript"><![CDATA[ 
document.write("Hello World!") 
//]]></script> 
+0

Einige zusätzliche Informationen dazu: xhtml wird normalerweise als mimetype text/html anstelle von application/xhtml + xml verwendet, wie es sollte, weshalb Fehler wie diese möglich sind. Siehe auch http://www.w3.org/TR/2002/NOTE-xhtml-media-types-20020801/ – wds

0

NekoHTML wird wahrscheinlich dieses Problem zu beheben für Sie auch, verwenden Sie es als ein der XMLReader.

Wenn Sie einen SAX-Filter verwenden, können Sie auch in der Lage sein CDATA events einfügen, nachdem Sie ein Startelement für <Skript> auftreten, obwohl das Parser abhängig sein könnte, da nicht alle Parsern die LexicalHandler features unterstützen.

Verwandte Themen