首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >XHTML文档上的Java - SAX解析器

XHTML文档上的Java - SAX解析器
EN

Stack Overflow用户
提问于 2009-08-16 13:01:15
回答 3查看 5.2K关注 0票数 0

我正在尝试为从web上下载的XHTML文档编写一个SAX解析器。一开始,我在doctype声明上遇到了问题(我从here那里发现这是因为W3C故意阻止对DTD的访问),但我用以下命令修复了这个问题:

代码语言:javascript
代码运行次数:0
运行
复制
XMLReader reader = parser.getXMLReader();
reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);

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

代码语言:javascript
代码运行次数:0
运行
复制
    <script type="text/javascript" language="JavaScript">
function checkForm() {
answer = true;
if (siw && siw.selectingSomething)
    answer = false;
    return answer;
}//
</script>

具体来说,解析器在到达&&时抛出一个错误,因为它需要一个实体引用。确切的异常是:

代码语言:javascript
代码运行次数:0
运行
复制
`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错误和实体引用错误呢?

干杯,

皮特

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-16 13:09:13

您试图解析的(X)HTML不是有效的XML (否则您不会得到SAX解析错误)。并且,一个双和号("&&")证实了这一点。这意味着不能单独使用普通的XML解析器来解析文档。

您可以使用一些工具,比如TagSoup,这些工具将生成适当的SAX事件(您可以像以前一样使用相同的SAX/XML解析代码),但是TagSoup将负责将格式不佳的HTML事件映射到适当的SAX/XML事件。

票数 3
EN

Stack Overflow用户

发布于 2009-08-16 13:18:18

我认为您应该将脚本内容放在CDATA部分中,例如http://www.w3schools.com/TAGS/tag_script.asp给出了以下示例:

代码语言:javascript
代码运行次数:0
运行
复制
<script type="text/javascript"><![CDATA[
document.write("Hello World!")
//]]></script>
票数 1
EN

Stack Overflow用户

发布于 2010-04-15 01:30:59

如果你把它当做XMLReader使用,NekoHTML可能也会帮你解决这个问题。

如果使用SAX过滤器,也可以在遇到startElement之后插入CDATA events,尽管这可能依赖于解析器,因为并不是所有解析器都支持LexicalHandler features

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1284251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档