在相对路径上解析具有DTD架构的XML文件

Use*_*er1 10 java xml dtd

我有以下java代码:


DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc=db.parse(new File("/opt/myfile"));

/opt/myfile包含以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE archive SYSTEM "../../schema/xml/schema.dtd">
...

我收到以下错误:

java.io.FileNotFoundException: /../schema/xml/schema.dtd (No such file or directory)

这是一个大型java框架,它使用其他地方生成的XML文件.我认为相对路径是问题所在.我不认为在JVM启动之前更改cwd是可以接受的(路径来自JVM本身读取的配置文件),并且我没有找到在JVM运行时更改cwd的方法.如何使用适当的DTD解析此XML文件?

dog*_*ane 18

您需要使用自定义EntityResolver来调整DTD的路径,以便可以找到它.例如:

db.setEntityResolver(new EntityResolver() {
    @Override
    public InputSource resolveEntity(String publicId, String systemId)
            throws SAXException, IOException {
        if (systemId.contains("schema.dtd")) {
            return new InputSource(new FileReader("/path/to/schema.dtd"));
        } else {
            return null;
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

如果schema.dtd在您的类路径上,您可以使用getResourceAsStream它来加载它,而不指定完整路径:

return new InputSource(Foo.class.getResourceAsStream("schema.dtd"));
Run Code Online (Sandbox Code Playgroud)