我正在尝试解析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。有人可以帮我从这里出去吗?
谢谢!
答案 0 :(得分:0)
您尚未发布实际提供错误的代码。但是在Tika的情况下,它发生了,因为Tika期待格式良好的HTML,但没有得到一个。
发生这种情况的一个常见情况是嵌套ContentHandler,如下所示:
ContentHandler handler = new BodyContentHandler(new ToXMLContentHandler());
只需删除上面的包装并使用:
ContentHandler handler = new ToXMLContentHandler();
一切都应该没问题。
如果在其他代码段中发生这种情况,请记住这是因为输入HTML格式不正确。 查看JIRA issue了解详情。