Анализ файла XML со схемой DTD по относительному пути - PullRequest
10 голосов
/ 18 января 2011

У меня есть следующий код Java:


DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc=db.parse(new File("/opt/myfile"));

И /opt/myfile содержит что-то вроде:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE archive SYSTEM "../../schema/xml/schema.dtd">
...

Я получаю следующую ошибку:

java.io.FileNotFoundException: /../schema/xml/schema.dtd (No such file or directory)

Это большой Java-фреймворк, который использует XML-файл, созданный в другом месте. Я думаю, что относительный путь является проблемой. Я не думаю, что будет приемлемо изменить cwd до запуска JVM (путь берется из файла конфигурации, который читается самой JVM), и я не нашел способа изменить cwd во время работы JVM. Как мне проанализировать этот XML-файл с соответствующим DTD?

Ответы [ 3 ]

18 голосов
/ 18 января 2011

Вам нужно использовать пользовательский EntityResolver , чтобы настроить путь DTD, чтобы его можно было найти.Например:

db.setEntityResolver(new EntityResolver() {
    @Override
    public InputSource resolveEntity(String publicId, String systemId)
            throws SAXException, IOException {
        if (systemId.contains("schema.dtd")) {
            return new InputSource(new FileReader("/path/to/schema.dtd"));
        } else {
            return null;
        }
    }
});

Если schema.dtd находится на вашем пути к классам, вы можете просто использовать getResourceAsStream для его загрузки без указания полного пути:

return new InputSource(Foo.class.getResourceAsStream("schema.dtd"));
4 голосов
/ 29 ноября 2011
0 голосов
/ 22 июня 2016

Я использовал пользовательский EntityResolver, как в примере выше, но он все еще искал файл DTD в другом базовом каталоге.Я отладил его и обнаружил, что мне нужно изменить системное свойство user.dir.Поэтому я добавил эту строку в метод инициализации приложения, и теперь он работает.

System.setProperty("user.dir")
...