3

我正在编写一个屏幕抓取应用程序,它可以读取各种页面并提取数据。我正在使用SAXParserFactorygo get a 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)

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

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

4

4 回答 4

2

SAX 似乎无法做到这一点,但 StAX API 可以。有关如何设置的信息,请参阅上一个问题/答案。

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

于 2010-01-03T18:20:55.630 回答
1

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

编辑:刚刚看到它是一个Android应用程序。这会让事情变得更加艰难。NekoHTML 为 109kb,TagSoup 为 89kb。

于 2010-01-03T18:09:31.763 回答
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/

于 2010-01-03T17:38:49.157 回答
0

在我看来,您已经禁用了解析器理解如何处理 . 鉴于 SAX 解析器根本不理解这个实体,您希望它做什么。

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

于 2010-01-03T17:40:48.403 回答