2014-03-25 38 views
2

我有一個奇怪的問題,我不得不解析XML文件來獲取數據,當我解析文件時: http://www.nbp.pl/kursy/xml/c073z070413.xml,所有工作都正常(文件被解析),但是當我嘗試解析文件:http://www.nbp.pl/kursy/xml/a002z020103.xml然後我得到一個消息,該程序無法找到這個文件(在瀏覽器,XML文件中的作品)Java IO無法從URL中找到現有文件

例外:

java.io.FileNotFoundException:C:\項目\ AreYouSmart \ abch.dtd (找不到文件)

下面是一個完整的示例代碼。 (代碼從StackOverflow: XML parse file from HTTP拍攝)

public class TylkoPobieranie { 

    public static void main(String[] args) { 
     try { 
      new TylkoPobieranie().start(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private void start() throws Exception { 
     // link work: URL url = new URL("http://www.nbp.pl/kursy/xml/c073z070413.xml"); 
     URL url = new URL("http://www.nbp.pl/kursy/xml/a002z020103.xml"); 
     URLConnection connection = url.openConnection(); 

     Document doc = parseXML(connection.getInputStream()); 
     NodeList descNodes = doc.getElementsByTagName("pozycja"); 

     for (int i = 0; i < descNodes.getLength(); i++) { 
      System.out.println(descNodes.item(i).getTextContent()); 
     } 
    } 

    private Document parseXML(InputStream stream) throws Exception { 
     DocumentBuilderFactory objDocumentBuilderFactory = null; 
     DocumentBuilder objDocumentBuilder = null; 
     Document doc = null; 
     try { 
      objDocumentBuilderFactory = DocumentBuilderFactory.newInstance(); 
      //ANSWER: 
      objDocumentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 

      objDocumentBuilder = objDocumentBuilderFactory.newDocumentBuilder(); 

      doc = objDocumentBuilder.parse(stream); 
     } catch (Exception ex) { 
      throw ex; 
     } 

     return doc; 
    } 
} 
+2

您能否顯示每個XML文件的起始位置 - 在我看來,第二個文件是指在您的計算機上找不到的DTD(C :\ Projects \ AreYouSmart \ abch.dtd) - 順便說一句,我無法從我的瀏覽器打開第二個文件 – DaveH

+0

你可以看看http://stackoverflow.com/questions/155101/make-documentbuilder-parse-ignore -dtd-引用來查看如何忽略第二個文件中的DTD – DaveH

+0

@DaveHowes我將在您的評論中添加對DTD的引用位於a002z020103.xml文件(第二行)我將刪除我的答案首先發現問題。 –

回答

1

該XML文件有一行:

<!DOCTYPE tabela_kursow SYSTEM "abch.dtd"> 

這是它無法找到abch.dtd文件。

試試這個:

objDocumentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
+0

如何跳過這一行? – MikeB

1

默認的Xerces(內置在Java中的XML解析器)將嘗試即使解析器是非驗證加載外部DTD文件。

調用setValidating(false)不起作用,因爲它默認情況下已經無法驗證啓動。您可以在構建工廠後關閉外部DTD加載:

objDocumentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", 
            false);