Java - XHTML 文档上的 SAX 解析器

标签 java exception xhtml sax entityreference

我正在尝试为从网上下载的 XHTML 文档编写一个 SAX 解析器。起初我遇到了 doctype 声明的问题(我从 here 发现这是因为 W3C 故意阻止了对 DTD 的访问),但我用以下方法解决了这个问题:

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

但是,现在我遇到了第二个问题。当 SAX 解析器到达 XHTML 文档中嵌入的某些 Javascript 时,它会抛出异常:

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

具体来说,解析器一旦到达 && 就会抛出错误,因为它需要实体引用。确切的异常(exception)是:

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

我怀疑(但我不知道)如果我没有禁用 DTD,那么我就不会收到此错误。那么,如何避免 DTD 错误并避免实体引用错误呢?

干杯,

皮特

最佳答案

您尝试解析的 (X)HTML 不是有效的 XML(否则您不会收到 SAX 解析错误)。并且,双与号(“&&”)证实了这一点。这意味着您不能单独使用纯 XML 解析器来解析文档。

您可以使用一些工具,例如 TagSoup ,这将生成正确的 SAX 事件(您可以使用与以前相同的 SAX/XML 解析代码),但 TagSoup 将负责将格式不良的 HTML 事件映射到正确的 SAX/XML 事件。

关于Java - XHTML 文档上的 SAX 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1284251/

相关文章:

Android Bitmap.createScaledBitmap 在 Jelly Bean 4.1 上抛出 java.lang.OutOfMemoryError moSTLy

jquery - 链接在 ie8 兼容模式下不工作

html - 哪些 HTML 标签没有内容

java - hbase 独立快速启动失败可通过 maven 项目重复

java - 获取 java.io.WriteAbortedException : writing aborted; java. io.NotSerializableException,即使我实现可序列化

java - 安卓/Java : Returning postion of Array

c# - 拦截 C# 中的所有异常,即使它们已经被捕获

java - 自定义异常类不捕获异常

css - 内联样式对屏幕阅读器有害吗?

java - javadoc-eclipse 的问题