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

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

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

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

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
`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 05:09:13

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

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

票数 3
EN

Stack Overflow用户

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

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

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

Stack Overflow用户

发布于 2010-04-14 17:30:59

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

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

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

https://stackoverflow.com/questions/1284251

复制
相关文章

相似问题

java中的SAX解析器

22

子元素SAX解析器java

12

Java SAX解析器,存储属性

20

java XML dtd、sax解析器

10

Java中的Sax解析器编码

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文