我正在使用第三方应用程序并想更改其中一个文件。该文件以 XML 格式存储,但文档类型无效。
当我尝试阅读时,由于文档类型包含“file:///ReportWiz.dtd”而出错 (如图所示,带引号)我得到一个找不到文件的异常。有没有办法告诉 docbuilder 忽略这个?我已尝试将 DocumentBuilderFactory 的 setValidate 设置为 false,将 setNamespaceAware 设置为 false。
我能想到的唯一解决办法是
- 将文件逐行复制到一个新文件中,省略有问题的行,做我需要做的,然后复制到另一个新文件中并将有问题的行重新插入,或者
- 主要做与上面相同的事情,但使用某种 FileStream(虽然我不清楚如何做到这一点..help?)
DocumentBuilderFactory docFactory = DocumentBuilderFactory .newInstance(); docFactory.setValidating(false); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); Document doc = docBuilder.parse(file);
最佳答案
像这样告诉您的 DocumentBuilderFactory 忽略 DTD 声明:
docFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
参见 here获取可用功能的列表。
您可能还会发现 JDOM 比 org.w3c.dom 更容易使用:
org.jdom.input.SAXBuilder builder = new SAXBuilder();
builder.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
org.jdom.Document doc = builder.build(file);
关于Java 更改和移动非标准的 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/358048/