Java IO无法从URL中找到现有文件

时间:2014-03-25 10:17:54

标签: java xml-parsing

我有一个奇怪的问题,当我解析文件时,我必须解析XML文件以获取数据: http://www.nbp.pl/kursy/xml/c073z070413.xml,一切正常(文件被解析),但是当我尝试解析文件:http://www.nbp.pl/kursy/xml/a002z020103.xml然后我收到一条消息,程序找不到这个文件(在浏览器中,XML文件有效)

例外:

  

java.io.FileNotFoundException:C:\ Projects \ 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 个答案:

答案 0 :(得分:1)

该XML文件包含以下行:

<!DOCTYPE tabela_kursow SYSTEM "abch.dtd">

它找不到abch.dtd文件。

试试这个:

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

答案 1 :(得分:1)

默认情况下,即使解析器无法验证,Xerces(Java中的内置XML解析器)也会尝试加载外部DTD文件。

调用setValidating(false)没有任何效果,因为默认情况下它已经是非验证的。您可以在构建工厂后关闭外部DTD加载:

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