我正在尝试使用'DocumentBuilder'解析xml文件并出现以下错误。
java.net.MalformedURLException: no protocol: <http://java.sun.com/j2ee/dtds/application_1_2.dtd>
我的xml文件的第一部分是这样的(无法更改XML文件)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application 1.2//EN' '<http://java.sun.com/j2ee/dtds/application_1_2.dtd>'>
<application>
<display-name>Black hole</display-name>
<description>Black hole service framework</description>
<module>
<ejb>StructureService.jar</ejb>
</module>
<module>
<ejb>ResourceService.jar</ejb>
</module>
<module>
<ejb>DatumServiceInternal.jar</ejb>
</module>
这里,我是如何尝试解析XML文件的
File xml = new File(path);
FileInputStream inputStream = new FileInputStream(xml);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
return db.parse(inputStream , "UTF-8");
我尝试以不同的方式做到这一点,但我经常遇到上述错误。请帮我找到问题。
答案 0 :(得分:3)
如果您无法更改xml中的dtd网址,请使用实体解析程序,下面我修改了您之前的代码。
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
EntityResolver er = new EntityResolver() {
@Override
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException {
System.out.println(publicId);
System.out.println(systemId);
if (systemId.startsWith("<") && systemId.endsWith(">")) {
return new InputSource(systemId.substring(1,systemId.length()-1));
}
return null;
}
};
db.setEntityResolver(er);
db.parse(inputStream , "UTF-8");
答案 1 :(得分:1)
问题是在这一行引起的:
<!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application 1.2//EN' '<http://java.sun.com/j2ee/dtds/application_1_2.dtd>'>
删除&lt; &GT; doctype的以下部分中的括号:
'<http://java.sun.com/j2ee/dtds/application_1_2.dtd>'
现在应该可以了。我自己尝试使用你的xml内容,并没有任何例外。 这里你有我的xml内容版本:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application 1.2//EN' 'http://java.sun.com/j2ee/dtds/application_1_2.dtd'>
<application>
<display-name>Black hole</display-name>
<description>Black hole service framework</description>
<module>
<ejb>StructureService.jar</ejb>
</module>
<module>
<ejb>ResourceService.jar</ejb>
</module>
<module>
<ejb>DatumServiceInternal.jar</ejb>
</module>
</application>
希望它对你有所帮助。哦,您还可以将File对象直接传递给parse()函数,而不会生成FileInputStream