我有一个奇怪的问题,当我解析文件时,我必须解析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;
}
}
答案 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);