1

我正在使用 Dom4j 来解析 HTML 文档。Dom4j 需要 XML,因此不声明 HTML 实体。可以在文档的 DTD 中声明它们,但我正在解析外部输入,所以这是不合适的。我宁愿在解析器中以编程方式声明它们。

这是我的代码:

    // Read.
    final DocumentFactory df = DOMDocumentFactory.getInstance();
    SAXReader reader = new SAXReader();
    Document doc, outDoc;
    try {
        doc = reader.read( new StringReader(htmlStr) );
    }
    catch( Exception ex ){
        throw new RuntimeException("Error parsing the HTML:\n       " + ex.toString() );
    }

我看到了,SAXReaderreader.setEntityResolver( ??? );似乎不是解决方案,因为可覆盖的方法如下所示:

public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException

我正在寻找的是类似的东西

reader.setTrueEntityResolver( new EntityResolver(){
    public InputStream resolve( String name ){ ... }
}
4

2 回答 2

0

好吧,正如您所说,DOM4J 并不意味着解析 HTML。我宁愿使用tagsoupHTML Cleaner之类的东西。它只是不是实体,HTML 不是 XML。

于 2012-11-04T01:48:55.700 回答
0

我在http://evc-cit.info/dom4j/dom4j_groovy.html 中找到了一个可能的解决方案,建议在其中添加 XML Commons Catalog 的东西。

但是,这似乎有点矫枉过正,因为无论如何都没有指定 doctype,我只打算解决 commons HTML 4 实体。

更新:原来,如果没有明确的 DOCTYPE 声明,这没有任何效果 - EntityResolver 永远不会被调用。

Maven 部门:

    <dependency>
        <groupId>xml-resolver</groupId>
        <artifactId>xml-resolver</artifactId>
        <version>1.2</version>
        <scope>test</scope>
    </dependency>

在类路径中配置/CatalogManager.proeprties

# allow location to be relative to this file's directory
relative-catalogs=yes

# A semicolon-delimited list of catalog files.
# In this instance, we have a single catalog file, and it's a relative path name
catalogs=sgml-lib/xml.soc

# no debugging messages, please
verbosity=0

# Use the SYSTEM identifier 
prefer=system

告诉解析器在遇到 DTD 时使用目录解析器:

cResolver = new CatalogResolver( cMgr )
reader = new SAXReader( )
reader.setEntityResolver( cResolver )
于 2012-11-03T07:01:14.217 回答