首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使DocumentBuilder.parse忽略DTD引用

使DocumentBuilder.parse忽略DTD引用
EN

Stack Overflow用户
提问于 2008-09-30 21:08:03
回答 7查看 81K关注 0票数 86

当我用这个方法解析我的xml文件(变量f)时,我得到一个错误

C:\Documents和Settings\joe\Desktop\aicpcudev\OnlineModule\map.dtd (系统找不到指定的路径)

我知道我没有dtd,也不需要它。如何在忽略DTD引用错误的情况下将此File对象解析为Document对象?

代码语言:javascript
复制
private static Document getDoc(File f, String docId) throws Exception{
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(f);


    return doc;
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-09-30 22:19:26

@anjanb建议的方法类似

代码语言:javascript
复制
    builder.setEntityResolver(new EntityResolver() {
        @Override
        public InputSource resolveEntity(String publicId, String systemId)
                throws SAXException, IOException {
            if (systemId.contains("foo.dtd")) {
                return new InputSource(new StringReader(""));
            } else {
                return null;
            }
        }
    });

我发现简单地返回一个空的InputSource同样有效?

票数 59
EN

Stack Overflow用户

发布于 2008-10-01 01:39:58

尝试在DocumentBuilderFactory上设置功能:

代码语言:javascript
复制
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

dbf.setValidating(false);
dbf.setNamespaceAware(true);
dbf.setFeature("http://xml.org/sax/features/namespaces", false);
dbf.setFeature("http://xml.org/sax/features/validation", false);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

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

最后,我认为这些选项是特定于解析器实现的。Here is some documentation for Xerces2,如果有帮助的话。

票数 144
EN

Stack Overflow用户

发布于 2011-04-28 21:34:05

我发现了一个问题,即DTD文件与XML一起位于jar文件中。我根据这里的例子解决了这个问题,如下所示:

代码语言:javascript
复制
DocumentBuilder db = dbf.newDocumentBuilder();
db.setEntityResolver(new EntityResolver() {
    public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
        if (systemId.contains("doc.dtd")) {
             InputStream dtdStream = MyClass.class
                     .getResourceAsStream("/my/package/doc.dtd");
             return new InputSource(dtdStream);
         } else {
             return null;
         }
      }
});
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/155101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档