Как сделать "builder.parse (XML-файл, хранящийся внутри этого фляги)"? - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь использовать объект файла с путем к файлу XML внутри текущего файла JAR, который выполняется, в builder.parse (не абсолютный путь к файлу XML);

DocumentBuilder builder = dbf.newDocumentBuilder ();

Document doc = builder.parse ("resources / userConfig.xml");

Код работает в eclipse, но не экспортируетсяфлягаКогда я запускаю экспортированный jar, он не может найти XML в C: \ Users ...

1 Ответ

0 голосов
/ 10 февраля 2019

Для вашего случая вам нужен один, но последний метод ниже, который принимает InputStream.Последний метод добавлен в качестве примера для вашего случая с файлом в банке в classpath.Вы можете сделать обработку исключений по-другому.

public class XMLLib {

    public static DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

    public static Document readXML(File file) {
        try {
            final DocumentBuilder builder = builderFactory.newDocumentBuilder();
            return builder.parse(file);
        } catch (ParserConfigurationException ex) {
           return null;
        } catch (SAXException | IOException ex) {
           return null;
        }
    }

    public static Document readXML(InputStream is) {
        try {
            final DocumentBuilder builder = builderFactory.newDocumentBuilder();
            return builder.parse(is);
        } catch (ParserConfigurationException ex) {
             return null;
        } catch (SAXException | IOException ex) {
            return null;
        }
    }

    //example call:
    public static Document getDocumentResource(String resourcepath){
        try (InputStream is = XMLLib.class.getResourceAsStream(resourcepath)){
             return readXML(is); 
         } catch (IOException ex) {}
         return null;
    }
}

Еще несколько объяснений: в среде Eclipse извлекается xml-файл, так что вы можете получить к нему доступ непосредственно в виде файла (так как это «файл»).Теперь, когда все в банке, XML больше не существует как «Файл», поэтому вы должны извлечь его из файла.Загрузчик классов может сделать это через getResourceAsStream - так же, как он может читать другие ресурсы и классы.Таким образом, по сути, это загрузка XML, как Java загружает класс.Чтобы это работало, путь к ресурсу должен быть задан относительно пути к классу.Будет работать только указанная выше версия InputStream (или какой-либо другой подход, например, с использованием Path и файловой системы)

Обычно, если у вас есть ресурс в "resources / userConfig.xml", путь простой "/userConfig.xml".(но это зависит от того, как проект собран)

Я могу только догадываться (зависит от того, как проект собран), в вашем случае вам нужно:

Document document = XMLLib.getDocumentResource("/userConfig.xml");

Важно: Версия InputStreamработает с файлом в jar и с извлеченным файлом (это всегда ) - до тех пор, пока он не найден загрузчиком классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...