org.apache.xerces.dom.DeferredDocumentImpl与org.dom4j.Document不兼容

时间:2011-03-28 08:38:31

标签: java document xerces

我正在从URL读取一些RSS并遇到一些麻烦。 最初我有一个简单的实现:

SAXReader reader = new SAXReader();
Document doc = reader.read(new URL(sURL));

但是,如果响应非常慢,这不允许我超时请求。所以我把它改成了:

public static org.dom4j.Document readXml(InputStream is) throws SAXException, IOException,
        ParserConfigurationException {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

        dbf.setValidating(false);
        dbf.setIgnoringComments(false);
        dbf.setIgnoringElementContentWhitespace(true);
        dbf.setNamespaceAware(true);

        DocumentBuilder db = null;
        db = dbf.newDocumentBuilder();

        return (org.dom4j.Document)db.parse(is);
    }

     SAXReader reader = new SAXReader();

    URL myUrl = new URL(sURL);
    URLConnection c = myUrl.openConnection();
    c.setConnectTimeout(10000);
    c.setReadTimeout(10000);
    org.dom4j.Document doc = readXml(c.getInputStream());
    Element root = doc.getRootElement();

尝试此操作时,我收到了一个错误的错误:

org.apache.xerces.dom.DeferredDocumentImpl incompatible with org.dom4j.Document

我该如何避免这种情况?上述方法都不应该返回那种类型的Document,我也尝试转换为正确的文档类型..

编辑:问题是db.parse(是)返回org.w3c.dom ..

2 个答案:

答案 0 :(得分:4)

确保您的Element类型为org.dom4j.Element而不是org.w3c.domjavax.bind.xml等。

换句话说,dom4j API与Jav​​a的内置XML API不兼容。除非你使用字符串操作(例如在dom4j中生成XML并使用Java的XML解析它,反之亦然),否则这两者根本不会混合在一起。

答案 1 :(得分:1)

问题解决了!

使用:

DOMReader domReader = new DOMReader();
org.dom4j.Document dom4jDoc = domReader.read(doc);
org.dom4j.Element root = (Element)dom4jDoc.getRootElement();

org.dom4j.Document

创建org.w3c.dom.Document