В другой день, еще одна странная ошибка с 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
(для этого я получаю ту же ошибку, за исключением того, что весь относительный путь отображается как нулевой, поэтому 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 не разрешен правильно. Если я включу закомментированную строку, относительный каталог снова будет разрешен правильно. Это заставляет меня думать, что где-то некоторые настройки неверны ...