当我用这个方法解析我的xml文件(变量f)时,我得到一个错误
C:\Documents和Settings\joe\Desktop\aicpcudev\OnlineModule\map.dtd (系统找不到指定的路径)
我知道我没有dtd,也不需要它。如何在忽略DTD引用错误的情况下将此File对象解析为Document对象?
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;
}
发布于 2008-09-30 22:19:26
与@anjanb建议的方法类似
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同样有效?
发布于 2008-10-01 01:39:58
尝试在DocumentBuilderFactory上设置功能:
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,如果有帮助的话。
发布于 2011-04-28 21:34:05
我发现了一个问题,即DTD文件与XML一起位于jar文件中。我根据这里的例子解决了这个问题,如下所示:
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;
}
}
});
https://stackoverflow.com/questions/155101
复制相似问题