J'essaye de manipuler mon fichier XML appelé Test.XML.
Je peux voir le fichier dans mon dossier et je peux l'ouvrir. Code:
java.io.FileNotFoundException: C:\MyFolder\Test.xml (The system cannot find the file specified)
J'obtiens cette erreur:
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); domFactory.setIgnoringComments(true); DocumentBuilder builder = domFactory.newDocumentBuilder(); Document doc = builder.parse(new File("MyFolder\Test.xml"));
Pourquoi le code ne peut-il pas ouvrir / lire mon fichier, mais d'autres programmes comme Notepad ++ peuvent le faire?
*** Remarque: le vrai nom du fichier est "Use-cases \ testSuitesA_E_1002 + $ {user} 3_12022016 + $ {date} 2_2.5.xml".
7 Réponses :
On dirait que vous utilisez un chemin relatif dans la ligne mentionnée ci-dessous pour accéder au fichier.
Document doc = builder.parse(new File("MyFolder\Test.xml"));
De plus, vous avez utilisé le simple '\', utilisez plutôt '//'. Vous pouvez déboguer en utilisant deux options
Essayez d'utiliser le chemin absolu vers le fichier (utilisez toujours '//') et voyez que l'application a l'autorisation d'accéder au fichier. S'il y a accès, formez un chemin relatif correct à partir du répertoire où le programme s'exécute.
Si, pour une raison quelconque, votre programme n'est pas en mesure d'accéder à l'autorisation d'accéder au fichier, essayez de fournir l'autorisation requise.
J'ai eu le même problème récemment et j'ai trouvé que dans mon cas, le fichier était enregistré sous "abc.txt.txt" au lieu de "abc.txt".
Comme l'extension du fichier était masquée, je ne pouvais pas voir plus tôt que le fichier avait été enregistré avec une extension ajoutée au nom.
Vérifiez si le fichier est enregistré avec l'extension appropriée.
Ou, comme votre nom de fichier contient "date", cela peut poser problème. Vérifiez si le format de date lors de l'accès au fichier est le même que dans le nom du fichier.
Pourquoi ne pas essayer Document doc = builder.parse (new File ("Use-cases \\ testSuitesA_E_1002 + $ {user} 3_12022016 + $ {date} 2_2.5.xml"))
p >
Dans le chemin de votre fichier,
Cas d'utilisation \ t estSuitesA_E_1002 + $ {user} 3_12022016 + $ {date} 2_2.5.xml \ t
représente une séquence d'échappement.
Aussi, j'aimerais vérifier le {date}
que vous utilisez. Peut-être que votre date est au format 06 \ 06 \ 2018?
Ajoutez . \\
au début du nom de votre fichier.
.
représente le répertoire en cours d'exécution
Il semble que java essaie de trouver le dossier dans le dossier racine ( C: \
). L'ajout de .
indique à java de regarder dans le répertoire en cours d'exécution, et non dans C: \
. Mieux encore, n'utilisez pas de barres obliques inverses et utilisez une seule barre oblique:
new File("./MyFolder/Test.xml")
Essayez ceci:
System.out.println(new File("relative/path/to/File.xml").exists);
Il écrira votre répertoire de travail actuel dans le journal de la console. Ensuite, vous pouvez ajuster votre code comme ceci:
System.out.println(new File("").getAbsolutePath());
Il devrait vous dire si le fichier (ou répertoire) existe. Notez que c'est "/" et non "\".
Veuillez modifier votre code comme suit:
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());
Pour que ce code s'exécute, créez le projet pour les fichiers .class
. ClassLoader doit avoir des fichiers .class
. Sinon, il ne pourra pas lire le dossier ou les fichiers à partir du chemin de classe.
Remarque:
nouveau fichier ("MyFolder \ Test.xml") - Cela ne fonctionnera pas car vous n'avez pas fourni le chemin absolu. Vous devez utiliser classloader pour obtenir le fichier à partir du chemin de classe (dans ce cas, vous n'avez pas à mentionner le chemin complet). Classloader vous apporte le chemin absolu complet. Rappelez-vous: java.nio.File a besoin d'un chemin absolu pour son fonctionnement.
Si vous voulez lire un fichier depuis n'importe quel emplacement arbitraire, vous devez spécifier le chemin complet pour cela. (en supposant que vous essayez d'accéder au fichier à l'extérieur)
p >
J'ai essayé d'analyser le fichier xml dans d'autres dossiers. Il est imprimé avec succès. Le code est ci-dessous
Si vous avez besoin d'un chemin absolu, vous pouvez également utiliser Classloader pour charger le fichier XML.
<?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>
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()); } } } }
C'est dans le mauvais dossier.
"MyFolder \ Test.xml"
n'est pas une chaîne valide car\ T
n'est pas une séquence d'échappement valideNon, ce n’est pas le problème. Le vrai fichier que je recherche ne s'appelle pas Test.xml
Je suggère d'utiliser la barre oblique
/
. Sinon, vous rencontrerez souvent des problèmes entre les chemins Windows et les chemins Linux de toute façon. si vous devez utiliser '\', vous feriezFile ("MyFolder \\ Test.xml")
En plus d'utiliser la barre oblique «/», envisagez d'utiliser un chemin absolu au lieu de relatif, si possible.
Je ne crois tout simplement pas que votre code se compile réellement. Quel est le nom réel du fichier? Commence-t-il par
t
,b
,n
,r
ouf
?Cas d'utilisation \ testSuitesA_E_1002 + $ {user} 3_12022016 + $ {date} 2_2.5. xml
@TalAngel
\ t
est un échappement en Java; il est interprété comme un caractère tabulation . Vous devez soit échapper vos contre-obliques (en utilisant\\
), soit les remplacer par/
.