Java SAX解析器不解析文件名

Java SAX解析器不解析文件名,java,parsing,sax,Java,Parsing,Sax,又一天,SAX、Java和朋友又出现了一个奇怪的错误 我需要遍历File对象的列表,并将它们传递给SAX解析器。但是,由于IOException,解析器失败。但是,各种文件对象方法确认文件确实存在 我得到的输出: 11:53:57.838 [MainThread] DEBUG DefaultReactionFinder - C:\project\trunk\application\config\reactions\TestReactions.xml 11:53:57.841 [MainThrea

又一天,SAX、Java和朋友又出现了一个奇怪的错误

我需要遍历
File
对象的列表,并将它们传递给SAX解析器。但是,由于
IOException
,解析器失败。但是,各种
文件
对象方法确认文件确实存在

我得到的输出:

11:53:57.838 [MainThread] DEBUG DefaultReactionFinder - C:\project\trunk\application\config\reactions\TestReactions.xml
11:53:57.841 [MainThread] ERROR DefaultReactionFinder - C:\project\trunk\application\config\reactions\null (The system cannot find the file specified)
所以问题显然是第二行中的
null
。我已经尝试过将文件作为参数传递给解析器的几乎所有变体,包括作为
字符串
(都是从
getAbsolutePath()
手动输入的),作为
URI
,甚至更奇怪的是,作为
FileInputStream
(对于这一点,我得到了相同的错误,只是整个相对路径被报告为null,所以
C:\project\trunk\null

我所能想到的就是
SAXParserFactory
配置不正确。不过,我不知道是什么地方出了问题

以下是有关守则:

SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
try {
    parser = factory.newSAXParser();
}
catch (ParserConfigurationException e) {
    throw new InstantiationException("Error configuring an XML parser.  Given error message: \"" + e.getMessage() + "\".");
}
catch (SAXException e) {
    throw new InstantiationException("Error creating a SAX parser.  Given error message: \"" + e.getMessage() + "\".");
}
...
for (File f : fileLister.getFileList()) {
    logger.debug(f.getAbsolutePath());
    try {
        parser.parse(f, new ReactionHandler(input));
        //FileInputStream fs = new FileInputStream(f);
        //parser.parse(fs, new ReactionHandler(input));
        //fs.close();
    }
    catch (IOException e) {
        logger.error(e.getMessage());
        throw new ReactionNotFoundException("An error occurred processing file \"" + f + "\".");
    }
    ...
}
我没有特别规定提供自定义SAX解析器实现:我使用系统默认值。如有任何帮助,将不胜感激

编辑更多信息:

我使用流时的代码:

FileInputStream fs = new FileInputStream(f);
InputSource is = new InputSource(fs);
//is.setSystemId(f.toURI().toString());
parser.parse(is, new ReactionHandler(input));
它给出了输出

11:07:10.703 [MainThread] DEBUG DefaultReactionFinder - C:\project\trunk\application\config\reactions\TestReactions.xml
11:07:10.706 [MainThread] ERROR DefaultReactionFinder - C:\project\trunk\application\null (The system cannot find the file specified)

这表明XML文件的相对目录未正确解析。如果我包括注释掉的行,相对目录将再次正确解析。这使我认为某些设置不正确…

呃,我应该知道…问题不在于代码,而在于
DOCTYPE定义!我给出了一个公共标识符,但不是系统标识符。这意味着解析器无法解析的文件不是XML文件本身,而是DTD文件!

呃,我应该知道……问题不在于代码,而在于XML文件中的
DOCTYPE
定义!我给出了一个公共标识符这意味着解析器无法解析的文件不是XML文件本身,而是DTD文件