2015-05-28 41 views
1

我想使用'DocumentBuilder'解析xml文件,並且出現以下錯誤。使用DocumentBuilder解析XML文件時出現'MalformedURLException'

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"); 

我試着做不同的方式,但我經常得到錯誤。請幫我找到問題。

回答

3

如果你不能在xml中更改dtd url,使用實體解析器,下面我修改了你以前的代碼。

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"); 
+0

太棒了! EntityResolver解決了我的問題。 – Madhujith

1

問題是這樣的行內引起的:

<!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application 1.2//EN' '<http://java.sun.com/j2ee/dtds/application_1_2.dtd>'> 

文檔類型的以下部分中刪除<>括號:

'<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

+0

不幸的是,改變xml文件是不可能的。 – Madhujith

+0

另外我也直接通過我的文件,並沒有改變 – Madhujith

+0

你從哪裏得到的.xml文件?它是否自動生成? –

相關問題