在 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
我尝试将 ItemsXML 和 MonsterXML 标记为项目结构中的资源,但没有改变.
▼ 下面阅读一个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”。
首先post在这里所以耐心等待,如果我做错了什么也告诉我:)
我遇到这个问题,在我的 IDE 中,应用程序工作正常,它正确加载所有 XML 文件和所有数据。 但是当我“构建工件”发布时,发布的 application.jar NOT 显示我所有的 XML 数据。
经过大量谷歌搜索后,我认为这与我放置 XML 文件和文件夹的位置有关,因为当我尝试在 IDE 中重新创建错误时,它给了我文件路径的 NullPointerException .
此应用程序将供其他人使用,因此不能对绝对路径进行硬编码。
另外值得一提的是,我有 两个 功能。
--> 一个函数只读取一个 XML 文件,该文件位于 src 中它自己的包中。
--> 另一个函数用于从 src 中的单独包中读取几个 XML 文件。
我将粘贴下面的代码以及一张显示我在 IntelliJ 中的包结构的图片 IDE。
▼文件夹结构图在这里▼
https://i.stack.imgur.com/M9xap.png
我尝试将 ItemsXML 和 MonsterXML 标记为项目结构中的资源,但没有改变.
▼ 下面阅读一个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”。