如何配置Java SaxParserFactory来禁用实体检查?

时间:2010-01-03 17:30:43

标签: java android sax

我正在编写一个屏幕抓取应用程序,可以读取各种页面并提取数据。我正在使用SAXParserFactory去获取SAXParser,而XMLReader又会让我spf = SAXParserFactory.newInstance(); spf.setValidating(false); spf.setFeature("http://xml.org/sax/features/validation", false); spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); spf.setFeature("http://xml.org/sax/features/use-entity-resolver2", false); 。我已经像这样配置了工厂:

&nbsp

但是,每当我解析包含SEVERE: null org.xml.sax.SAXParseException: The entity "nbsp" was referenced, butnot declared. at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1231) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 实体的文档时,我都会得到

{{1}}

我可以理解它无法找到实体,因为我告诉工厂不读DTD,但是如何禁用实体检查alltogther?

编辑:这是针对Android应用的,这就是为什么我不愿意使用不在标准环境中的API /库。

4 个答案:

答案 0 :(得分:2)

SAX似乎无法做到这一点,但StAX API确实如此。有关如何进行设置,请参阅this previous question/answer

如果您手动编写XML处理器,那么StAX API比SAX API更容易处理,因此您在两个方面都获胜。

答案 1 :(得分:1)

如果是您正在阅读的HTML页面,我强烈建议使用其中一个库来处理即使有效的HTML不是XML而且大多数HTML无效的事实。尝试其中之一:

编辑:刚刚看到它是一款Android应用。这将使其更加艰难。 NekoHTML的容量为109kb,TagSoup的容量为89kb。

答案 2 :(得分:0)

我认为可以通过编写自己的DOMErrorHandler实例来拦截这些错误 - 更多细节请点击此处: http://xerces.apache.org/xerces2-j/faq-write.html

我已经使用这种方法来解决一个问题,即我将绘图解析为Corel Draw 12生成的XML SVG文档,该文档有时在其输出的文档中打破了SVG DTD规则。

为什么你告诉它不读DTD?这是因为您不希望它通过连接到互联网从W3C服务器访问它;您想要一个具有本地DTD的独立的离网解决方案吗?我需要相同:我在本地下载了SVG DTD和模块,并使用此Java库强制本地DTD访问:http://doctypechanger.sourceforge.net/

答案 3 :(得分:0)

在我看来,你已经禁用了解析器理解如何处理 的能力。如果SAX解析器根本不理解这个实体,你会期望它做什么。

也许如果您正在抓取HTML,最好使用JTidy?它是一个HTML解析器,它在DOM中呈现HTML以供进一步分析。