我正在尝试操作名为 Test.XML 的 XML 文件。
我可以在我的文件夹中看到该文件,并且可以打开它。 代码:
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setIgnoringComments(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(new File("MyFolder\Test.xml"));
我收到此错误:
java.io.FileNotFoundException: C:\MyFolder\Test.xml (The system cannot find the file specified)
为什么代码无法打开/读取我的文件,但其他程序(如 Notepad++)可以这样做?
***注意:文件的真实名称是“Use-cases estSuitesA_E_1002+${user}3_12022016+${date}2_2.5.xml”。
请将您的代码修改为:
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setIgnoringComments(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(new File(classLoader.getResource("MyFolder/Test.xml").getPath()));
System.out.println(doc.getDocumentElement());
要运行此代码,请为
.class
文件构建项目。类加载器需要有 .class
文件。否则,它将无法从类路径读取文件夹或文件。
注:
new File("MyFolder\Test.xml")
- 这将不起作用,因为您没有提供绝对路径。您必须使用类加载器从类路径获取文件(在这种情况下,您不必提及完整路径)。类加载器为您带来完整的绝对路径。 记住: java.nio.File
需要绝对路径才能工作。
如果您想从任意位置读取文件,则必须指定其完整路径。 (假设您正在尝试访问外部文件)
尝试一下如何
Document doc = builder.parse(new File("Use-cases\\testSuitesA_E_1002+${user}3_12022016+${date}2_2.5.xml"))
在您的文件路径中, 用例 estSuitesA_E_1002+${user}3_12022016+${date}2_2.5.xml
\t
表示转义序列。
另外,我很想检查一下您正在使用的
{date}
,也许您的日期格式类似于 06 �8?
我尝试解析其他文件夹中的xml文件。就打印成功了。代码如下
如果需要绝对路径,也可以使用Classloader来加载XML文件。
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class Testing {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
parseXmlFile();
}
private static void parseXmlFile() throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setIgnoringComments(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(new File("src/main/java/xmlfiles/Test.xml"));
if (doc.hasChildNodes()) {
printNote(doc.getChildNodes());
}
}
private static void printNote(NodeList nodeList) {
for (int count = 0; count < nodeList.getLength(); count++) {
Node tempNode = nodeList.item(count);
if (tempNode.getNodeType() == Node.ELEMENT_NODE) {
System.out.println("Value = " + tempNode.getTextContent());
}
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<company>
<staff id="100">
<firstname>Tom</firstname>
<lastname>Jerry</lastname>
<nickname>Tomy</nickname>
<salary>100000</salary>
</staff>
<staff id="200">
<firstname>Micky</firstname>
<lastname>Mouse</lastname>
<nickname>Mike</nickname>
<salary>200000</salary>
</staff>
</company>
看起来您正在使用下面提到的行中的相对路径来访问该文件。
Document doc = builder.parse(new File("MyFolder\Test.xml"));
此外,您使用了单个“\”,而是使用“//”。您可以使用两个选项进行调试
尝试使用文件的绝对路径(始终使用“//”)并查看应用程序是否有权访问该文件。如果存在访问权限,则从程序执行的目录形成正确的相对路径。
如果由于某种原因您的程序无法访问该文件的权限,请尝试提供所需的权限。
我最近遇到了同样的问题,我发现在我的情况下,文件保存为“abc.txt.txt”而不是“abc.txt”。
由于文件扩展名被隐藏,我之前无法看到该文件是在名称中添加了扩展名保存的。
检查文件是否以正确的扩展名保存。
或者,由于您的文件名中包含“日期”,因此可能会导致问题。检查访问文件时的日期格式是否与文件名中的相同。
将
.\\
添加到文件名的开头。.
代表当前运行目录看起来java正在尝试从根文件夹中查找该文件夹(
C:\
)。添加 .
告诉 java 查看当前运行目录,而不是 C:\
。更好的是,不要使用反斜杠并使用单个正斜杠:
new File("./MyFolder/Test.xml")
试试这个:
System.out.println(new File("").getAbsolutePath());
它将在控制台日志中写入您当前的工作目录。然后你可以像这样调整你的代码:
System.out.println(new File("relative/path/to/File.xml").exists);
它应该告诉您文件(或目录)是否存在。注意是“/”而不是“\”。