Domanda

Sto cercando di scrivere un parser SAX per un documento XHTML che ho scaricato dal web. In un primo momento ho avuto un problema con il dichiarazione DOCTYPE (ho scoperto da qui che era perché W3C ha intenzionalmente bloccato l'accesso alla DTD), ma ho risolto che con:

XMLReader reader = parser.getXMLReader();
reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);

Tuttavia, ora sto vivendo un secondo problema. Il parser SAX genera un'eccezione quando si raggiunge un certo JavaScript incorporato nel documento XHTML:

    <script type="text/javascript" language="JavaScript">
function checkForm() {
answer = true;
if (siw && siw.selectingSomething)
    answer = false;
    return answer;
}//
</script>

In particolare il parser genera un errore una volta che raggiunge s ', il && come si aspetta un riferimento all'entità. L'eccezione esatta è:

`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)`

Ho il sospetto (ma non so) che se non avessi disattivato il DTD, allora non avrei ottenere questo errore. Così, come posso evitare l'errore DTD ed evitare l'errore di riferimento entità?

Saluti,

Pete

È stato utile?

Soluzione

L'(X) HTML che si sta tentando di analizzare non è XML valido (altrimenti non sarebbe sempre un errore di parsing SAX). E, una doppia e commerciale ( "&&") conferma che. Ciò significa che da sola, non è possibile utilizzare utilizzare un parser XML semplice per analizzare il documento.

Ci sono strumenti che è possibile utilizzare, ad esempio TagSoup , che sarà generare eventi SAX corretti (è possibile utilizzare lo stesso codice di analisi SAX / XML come prima), ma TagSoup si prenderà cura di mappare gli eventi HTML mal formati da adeguati eventi SAX / XML.

Altri suggerimenti

Credo che si suppone di mettere il contenuto dello script in una sezione CDATA, ad esempio http : //www.w3schools.com/TAGS/tag_script.asp fornisce il seguente esempio:

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

NekoHTML probabilmente risolvere questo problema per voi pure, lo si utilizza come il XMLReader.

Se si utilizza un filtro SAX, si potrebbe anche essere in grado di inserire eventi CDATA dopo si verifica uno startElement per

scroll top