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

我有以下java代码:

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

/opt/myfile包含以下内容:

 
 
 ...

我收到以下错误:

 java.io.FileNotFoundException:/../schema / xml / schema.dtd(没有这样的文件或目录)

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

您需要使用自定义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; } } }); 

如果schema.dtd在您的类路径上,您只需使用getResourceAsStream加载它,而无需指定完整路径:

 return new InputSource(Foo.class.getResourceAsStream("schema.dtd")); 

您也可以完全忽略DTD: http : //marcels-javanotes.blogspot.com/2005/11/parsing-xml-file-without-having-access.html

我使用了上面的示例中的自定义EntityResolver,但它仍然在另一个基目录中搜索DTD文件。 所以我对其进行了调试,然后发现我需要更改user.dir系统属性。 所以我将此行添加到我的应用程序初始化方法中,现在可以正常工作

 System.setProperty("user.dir")