Pergunta

Eu estou tentando escrever um parser SAX para um documento XHTML que eu baixar da web. No começo eu estava tendo um problema com a declaração doctype (eu descobri de aqui que era porque W3C intencionalmente bloqueou o acesso ao DTD), mas eu fixo que, com:

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

No entanto, agora eu estou experimentando um segundo problema. O analisador SAX gera uma exceção quando ele atinge alguns Javascript embutido no documento XHTML:

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

Especificamente, o analisador gera um erro uma vez que atinge os 's &&, como ele está esperando uma referência de entidade. A exceção exata é:

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

Eu suspeito (mas eu não sei) que se eu não tivesse desativado o DTD então eu não iria receber esse erro. Então, como posso evitar o erro DTD e evitar o erro referência de entidade?

Cheers,

Pete

Foi útil?

Solução

A (X) HTML você está tentando analisar não é XML válido (caso contrário, você não estaria recebendo um erro de análise SAX). E, um duplo E comercial ( "&&") confirma que. Isso significa que em seu próprio país, você não pode usar usar um parser XML simples para analisar o documento.

Existem ferramentas que você pode usar, como TagSoup , que será geram eventos SAX adequadas (você pode usar o mesmo SAX / XML análise de código como antes), mas TagSoup vai cuidar de mapear os eventos mal-formado HTML para eventos SAX / XML adequadas.

Outras dicas

Eu acho que você deveria colocar o conteúdo do script em uma seção CDATA, por exemplo http : //www.w3schools.com/TAGS/tag_script.asp dá o seguinte exemplo:

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

NekoHTML provavelmente vai corrigir isso para você também, você usá-lo como o XMLReader.

Se você estiver usando um filtro SAX, você pode também ser capaz de inserir eventos CDATA depois de encontrar um startElement para

scroll top