另一天,SAX,Java和朋友的另一个奇怪的错误。
我需要遍历File
个对象列表并将它们传递给SAX解析器。但是,解析器因IOException
而失败。但是,各种File
对象方法确认该文件确实存在。
我得到的输出:
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
。我已尝试将文件作为参数传递给解析器的几乎所有变体,包括作为String
(均来自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文件的相对目录。如果我包含已注释掉的行,则会再次正确解析相对目录。这让我觉得某些设置不正确......
答案 0 :(得分:0)
呃,我应该知道......问题不是代码,而是XML文件中的DOCTYPE
定义!我提供了一个公共标识符,但没有提供系统标识符。这意味着解析器无法解析的文件不是XML文件本身,而是DTD文件!