我正在编写一个屏幕抓取应用程序,可以读取各种页面并提取数据。我正在使用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);
。我已经像这样配置了工厂:
 
但是,每当我解析包含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 /库。
答案 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以供进一步分析。