2010-05-17 55 views
2

另一天,SAX,Java和朋友发生了另一个奇怪的错误。SAX解析器不能解析文件名

我需要迭代一个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(为此我得到了相同的错误,除了整个相对路径被报告为空,所以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

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