SAX-парсер не разрешает имя файла - PullRequest
2 голосов
/ 17 мая 2010

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

1 Ответ

0 голосов
/ 18 мая 2010

Тьфу, я должен был знать ... проблема не в коде, а в определении DOCTYPE в файле XML! Я дал открытый идентификатор, но не идентификатор system . Это означает, что файл, который не удалось разрешить анализатору, был не самим файлом XML, а файлом DTD!

...