使用Java SAX解析缺少doctype声明的xhtml实体

时间:2013-11-26 17:10:30

标签: java xml sax apache-tika

我正在尝试解析Tika服务器的xhtml输出。 xml输入流(我通过apache HttpClient获取)声明了一个命名空间,但没有声明一个dtd,root看起来像:

<html xmlns="http://www.w3.org/1999/xhtml">

如果我尝试使用SAX解析输入流,如果xml流包含实体,则会遇到错误

Exception in thread "main" org.xml.sax.SAXParseException; lineNumber: 47; columnNumber: 37; The entity "rsquo" was referenced, but not declared. 

我试图强制解析器使用xhtml 1.1 dtd的本地副本

    class XhtmlResolver implements EntityResolver {
        public InputSource resolveEntity(String publicId, String systemId) {
            InputStream in = getClass().getResourceAsStream("src/main/java/com/w3c/xhtml/xhtml11.dtd");
            return new InputSource(in);
        }
    }

    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();
    XMLReader reader = saxParser.getXMLReader();
    reader.setEntityResolver(new XhtmlResolver());
    reader.parse(new InputSource(inputStream));

但它仍未解析实体。我仍然在任何包含实体的xhtml流上获得SAXParseException。有人可以帮我从这里出去吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您尚未发布实际提供错误的代码。但是在Tika的情况下,它发生了,因为Tika期待格式良好的HTML,但没有得到一个。

发生这种情况的一个常见情况是嵌套ContentHandler,如下所示:

 ContentHandler handler = new BodyContentHandler(new ToXMLContentHandler());

只需删除上面的包装并使用:

ContentHandler handler = new ToXMLContentHandler();

一切都应该没问题。

如果在其他代码段中发生这种情况,请记住这是因为输入HTML格式不正确。 查看JIRA issue了解详情。