如何配置Java';s SaxParserFactory是否禁用实体检查?

如何配置Java';s SaxParserFactory是否禁用实体检查?,java,android,sax,Java,Android,Sax,我正在编写一个屏幕抓取应用程序,可以读取各种页面并提取数据。我正在使用SAXParserFactory去获取一个SAXParser,这反过来又为我获取了一个XMLReader。我对工厂进行了如下配置: spf = SAXParserFactory.newInstance(); spf.setValidating(false); spf.setFeature("http://xml.org/sax/features/validation", false); spf.setFeature("http

我正在编写一个屏幕抓取应用程序,可以读取各种页面并提取数据。我正在使用
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)
我可以理解它找不到实体,因为我告诉工厂不要读取DTD,但是我如何禁用实体检查呢


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

我认为可以通过编写自己的DomerroHandler实例来拦截这些错误-更多详细信息如下:

我使用这种方法解决了一个问题,即我将图形解析为Corel Draw 12生成的XML SVG文档,这有时会破坏它输出的文档中的SVG DTD规则


你为什么告诉它不要阅读DTD?这是因为您不希望它通过连接到internet从W3C服务器访问此文件;您想要一个带有本地DTD的独立的非网络解决方案吗?我也需要这样做:我在本地下载了SVG DTD和模块,并使用这个Java库强制本地DTD访问:

在我看来,您已经禁用了解析器理解如何处理
的功能。如果SAX解析器根本不理解这个实体,那么您希望它做什么呢


也许如果你正在抓取HTML,你最好使用?它是一个HTML解析器,用于在DOM中显示HTML以供进一步分析。

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


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

SAX似乎无法做到这一点,但StAX API做到了。有关如何设置此项的信息,请参见


如果您是手工编写XML处理器,那么StAX API比SAX API更容易处理,因此您在这两个方面都赢了。

这是一个Android应用程序,因此不希望包含像JTidy或使用DOM这样的依赖项。事实上,我发现Android平台包含一个非常类似的(相同的?)他们称之为XmlPullParser的API。是的,XPP也很好,尽管它是非标准的(无论如何,用JavaSE术语)。