Pregunta

Estoy tratando de escribir un analizador SAX para un documento XHTML que puedo descargar desde la web. Al principio estaba teniendo un problema con la declaración DOCTYPE (descubrí de aquí que era porque W3C ha bloqueado intencionadamente el acceso a la DTD), pero lo solucionó con:

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

Sin embargo, ahora que estoy experimentando un segundo problema. El analizador SAX lanza una excepción cuando se alcanza algo de JavaScript incrustado en el documento XHTML:

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

En concreto, el analizador emite un error una vez que alcanza el && 's, ya que está esperando una referencia de entidad. La excepción es exacta:

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

Sospecho (pero no sé) que si no hubiera desactivado el DTD, entonces no me obtener este error. Así que, ¿cómo puedo evitar el error DTD y evitar el error de referencia de la entidad?

Saludos,

Pete

¿Fue útil?

Solución

El (X) HTML que está tratando de analizar no es XML válido (de lo contrario no estaría recibiendo un error de análisis SAX). Y, un doble signo ( "&&") lo confirma. Eso significa que por sí sola, no puede utilizar utilizar un analizador XML claro para analizar el documento.

Hay herramientas que puede utilizar, como TagSoup , que se generar eventos SAX apropiados (se puede utilizar el mismo código de análisis SAX / XML como antes), pero TagSoup se hará cargo de la cartografía de los eventos HTML mal formados-a-eventos adecuados SAX / XML.

Otros consejos

Creo que se supone que poner el contenido de la escritura en una sección CDATA, por ejemplo http : //www.w3schools.com/TAGS/tag_script.asp da el siguiente ejemplo:

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

NekoHTML probablemente arreglar esto para usted también, que lo utilice como el XMLReader.

Si estás usando un filtro de SAX, éstos también debería ser capaz de insertar eventos CDATA después se encuentra con un startElement para

scroll top