使用DocumentBuilder解析XML文件时出现'MalformedURLException'

时间:2015-05-28 11:13:40

标签: java xml

我正在尝试使用'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");

我尝试以不同的方式做到这一点,但我经常遇到上述错误。请帮我找到问题。

2 个答案:

答案 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