在 IntelliJ 中查找 XML 文件时出现问题,即使它们存在

Problem with finding XML files in IntelliJ even though they are there

首先post在这里所以耐心等待,如果我做错了什么也告诉我:)

我遇到这个问题,在我的 IDE 中,应用程序工作正常,它正确加载所有 XML 文件和所有数据。 但是当我“构建工件”发布时,发布的 application.jar NOT 显示我所有的 XML 数据。

经过大量谷歌搜索后,我认为这与我放置 XML 文件和文件夹的位置有关,因为当我尝试在 IDE 中重新创建错误时,它给了我文件路径的 NullPointerException .

此应用程序将供其他人使用,因此不能对绝对路径进行硬编码。

另外值得一提的是,我有 两个 功能。

--> 一个函数只读取一个 XML 文件,该文件位于 src 中它自己的包中。

--> 另一个函数用于从 src 中的单独包中读取几个 XML 文件。

我将粘贴下面的代码以及一张显示我在 IntelliJ 中的包结构的图片 IDE。

▼文件夹结构图在这里▼

https://i.stack.imgur.com/M9xap.png

我尝试将 ItemsXMLMonsterXML 标记为项目结构中的资源,但没有改变.

▼ 下面阅读一个XML文件▼

public void ReadItemXMLfile(){
        try{
            String fileName = "src\ItemsXML\items.xml";

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true);
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(fileName);

            XPathFactory xpathfactory = XPathFactory.newInstance();
            XPath xpath = xpathfactory.newXPath();

            XPathExpression expr = xpath.compile("/items/item"); // LOOT ID NUMBER
            Object result = expr.evaluate(doc, XPathConstants.NODESET);
            NodeList nodes = (NodeList) result;

            for (int i = 0; i < nodes.getLength(); i++) { 
                Node testNode = nodes.item(i);
                if(testNode.getNodeType() == Node.ELEMENT_NODE){
                    Element element = (Element) testNode;
                    String idFromItemXml = "";
                    String itemNameFromItemXml = "";
                    idFromItemXml = element.getAttribute("id");
                    itemNameFromItemXml = element.getAttribute("name");
                    for(MonsterXML monster : monstersArrayList){
                        for(MonsterLootXML loot : monster.getLootableItems()){
                            if(loot.getId().equals(idFromItemXml)){
                                loot.setName(itemNameFromItemXml.substring(0, 1).toUpperCase() + itemNameFromItemXml.substring(1));
                            }
                        }
                    }
                }
            }
        } catch (ParserConfigurationException parserConfigurationException) {
            parserConfigurationException.printStackTrace();
        } catch (IOException ioException) {
            ioException.printStackTrace();
        } catch (XPathExpressionException xPathExpressionException) {
            xPathExpressionException.printStackTrace();
        } catch (SAXException saxException) {
            saxException.printStackTrace();
        }
    }

▼阅读下面一个文件夹中的几个XML文件▼

public void ReadMonsterXMLfiles(){
        try{
            File dir = new File("src\MonsterXML");
            if (dir.exists() && dir.isDirectory()) {
                File [] files = dir.listFiles((d, name) -> name.endsWith(".xml"));
                if (files != null) {
                    for (File file: files) {

                        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                        factory.setNamespaceAware(true); // never forget this!
                        DocumentBuilder builder = factory.newDocumentBuilder();
                        Document doc = builder.parse(file.getPath());

                        XPathFactory xpathfactory = XPathFactory.newInstance();
                        XPath xpath = xpathfactory.newXPath();

                        XPathExpression expr = xpath.compile("/monster/@name |  /monster/@experience |  /monster/@manacost | /monster/health/@now");
                        Object result = expr.evaluate(doc, XPathConstants.NODESET);
                        NodeList nodes = (NodeList) result;

                        MonsterXML monsterXML = new MonsterXML();

                        monsterXML.setName(nodes.item(2).getTextContent());
                        monsterXML.setHealth(nodes.item(3).getTextContent());
                        monsterXML.setExperience(nodes.item(0).getTextContent());
                        monsterXML.setManaToSummon(nodes.item(1).getTextContent());
                        monsterXML.setName(monsterXML.getName().substring(0, 1).toUpperCase() + monsterXML.getName().substring(1));

                        // MONSTER LOOT (ID) AND MONSTER LOOT (DROPCHANCE%)
                        expr = xpath.compile("/monster/loot//item"); // LOOT ID NUMBER
                        result = expr.evaluate(doc, XPathConstants.NODESET);
                        nodes = (NodeList) result;
                        MonsterLootXML monsterLootXML = null;
                        for (int i = 0; i < nodes.getLength(); i++) {
                            Node testNode = nodes.item(i);
                            if(testNode.getNodeType() == Node.ELEMENT_NODE){
                                Element element = (Element) testNode;
                                monsterLootXML = new MonsterLootXML();
                                monsterLootXML.setId(element.getAttribute("id"));
                                monsterLootXML.setLootChance(element.getAttribute("chance"));
                                monsterLootXML.setLootChance(Calculations.correctDropChanceNumber(monsterLootXML.getLootChance()));

                                if(element.hasAttribute("countmax")){
                                    monsterLootXML.setAmount(element.getAttribute("countmax"));
                                }
                                else{
                                    monsterLootXML.setAmount("1");
                                }
                                monsterXML.addLootableItems(monsterLootXML);
                            }
                        }
                        monstersArrayList.add(monsterXML);
                    }
                }
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

如果有人知道这一点,我很乐意在可能的情况下获得一些关于 discord 的辅导:)

谢谢大家!

答案是 将 XML 文件包含在您的文件夹中(在您的 .jar 之外),然后仅引用该 XML 文件启动应用程序时。 如果您想在 .jar 中包含 XML 文件并从那里加载它们,您需要查找“getResourceAsStream”。