这里的第一篇文章,所以请耐心等待,也告诉我我是否做错了什么:)
我有这个问题,在我的IDE中,应用程序运行良好,并且它使用所有数据正确加载所有XML文件。 但是,当我"构建工件"以发布已发布的应用程序时.jar不会显示我的所有 XML 数据。
经过大量的谷歌搜索,我认为这与我放置XML文件和文件夹的位置有关,因为当我尝试在IDE中重新创建错误时,它给了我文件路径的NullPointerException。
此应用程序将由其他人使用,因此无法对绝对路径进行硬编码。
另外很高兴知道我有两个功能。
-->一个函数,用于仅读取位于 src 内部自身包中的一个 XML 文件。
-->另一个函数,用于从 src 中的单独包中读取多个 XML 文件。
我将粘贴下面的代码以及一张在 IntelliJ IDE 中显示我的包结构的图片。
▼文件夹结构图片在这里 ▼
https://i.stack.imgur.com/M9xap.png
我尝试在项目结构中将ItemsXML和MonsterXML标记为资源,但没有更改。
▼读取下面的一个XML文件 ▼
public void ReadItemXMLfile(){
try{
String fileName = "srcItemsXMLitems.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();
}
}
如果有人非常了解这一点,如果可能的话,我很想得到一些关于不和谐的辅导:)
谢谢大家!
答案是将 XML 文件包含在您的文件夹中(在您的.jar之外(,然后在启动应用程序时重新访问该 XML 文件。 如果你想把XML文件放在你的.jar里,并从那里加载它们,你需要查找"getResourceAsStream"。