5

我正在用 Java 编写一个程序,我从 XML 文件中读取数据并解析它。该文件被导入到我项目的 src 目录中名为“Resources”的文件夹中。我正在使用 Eclipse。当我运行程序时,我收到以下错误:

java.io.FileNotFoundException: /Users/thechiman/Dropbox/introcs/PSU SOC Crawler/resources/majors_xml_db.xml (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(FileInputStream.java:66)
...

相关代码在这里:

private void parseXML() {
    //Get a factory
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

    try {
        //Use factory to get a new DocumentBuilder
        DocumentBuilder db = dbf.newDocumentBuilder();

        //Parse the XML file, get DOM representation
        dom = db.parse("resources/majors_xml_db.xml");
    } catch(ParserConfigurationException pce) {
        pce.printStackTrace();
    } catch(SAXException se) {
        se.printStackTrace();
    } catch(IOException ioe) {
        ioe.printStackTrace();
    }
}

我不明白为什么当文件存在时我会收到 FileNotFoundException。谢谢您的帮助。

4

1 回答 1

6

使用DocumentBuilder.parse(String),参数被解释为一个 URI,在这种情况下,它将是一个相对 URI(你给它的字符串不是一个“完整”的 URI)。在这一点上,它的相关有点模棱两可,没有关于您的设置的更多信息。运行时会将其解释为相对于something,但这里不清楚那是什么。

通过使用其他方法之一,您将获得更可靠的结果parse,例如parse(File)parse(InputStream)。在每种情况下,您要求它解析的内容都没有歧义。

如果您决定先构造一个File对象(以便parse稍后传递),那么您将面临一个更易于管理的问题,即确保该文件存在(使用File.exists()等)。如果你做不到那么远,那么你的问题不DocumentBuilder在于 DOM,而在于基本文件路径。请记住,如果您使用相对文件路径(例如new File("resources/majors_xml_db.xml")),那么这将相对于进程的工作目录进行解析。它是否有效取决于您启动程序的方式。

于 2010-04-04T22:14:43.997 回答