J'essaie de charger un fichier XML situé dans un dossier de mon projet (à l'aide de Visual Studio 2012).
La structure est la suivante:
solutionRoot\
- service\
-- ServiceClass.cs
-- AppValues.xml <-- this is the file I want to load
Dans ma ServiceClass, j'essaie de lire le fichier XML avec le code suivant:
public String GetXmlElement(String elementName)
{
[....]
XDocument document = XDocument.Load(@"\service\AppValues.xml");
[...]
}
Ce qui donne l'erreur suivante, quand j'essaye de tester le code:
Test method PandaTests.ServiceTest.ReadXmlCanReadXml threw exception:
System.IO.DirectoryNotFoundException: Could not find a part of the path
'C:\Users\MyName\Documents\GitHub\project\Project22\PandaTests\bin\Debug\service\AppValues.xml'.
C'est évidemment un problème avec mon chemin, mais je n'arrive pas à comprendre comment obtenir le bon chemin relatif. J'ai examiné d'autres questions ici sur le dépassement de capacité, mais beaucoup d'entre elles semblent trop impliquées. Existe-t-il un moyen simple de charger le fichier XML sans donner de chemin absolu?
Lorsque VS exécute votre programme, votre répertoire de travail est défini sur le dossier Debug/Release, et non sur la racine de votre solution.
Vous avez deux options que je connais ...
J'ai rencontré le même problème et l'ai résolu en utilisant "Server.MapPath"
Par exemple,
string path=Server.MapPath("~/service/AppValues.xml");
XDocument document = XDocument.Load(path);
J'espère que ça aide.
Affichez les propriétés dans Visual Studio pour AppValues.xml. Remplacez "Copier dans le répertoire de sortie" par "Copier si plus récent" et générez le projet.
vérifie ça
XDocument document = XDocument.Load(@"..\service\AppValues.xml");
Je l'ai résolu en 2 étapes. J'utilise MVC et je devais l'utiliser dans un fichier de classe.
1) chemin de chaîne
=HttpContext.Current.Server.MapPath("~/App_Data/yourxmlfilename.xml");
XDocument doc = XDocument.Load(path);
2) Modifier les propriétés du fichier XML
Action de construction: contenu
Copier dans le répertoire de sortie: toujours copier
Définissez l'action de construction du fichier XML sur "Ressource intégrée", puis faites référence à l'aide de ce code
private static UnmanagedMemoryStream GetResourceStream(string resName)
{
var Assembly = Assembly.GetExecutingAssembly();
var strResources = Assembly.GetName().Name + ".g.resources";
var rStream = Assembly.GetManifestResourceStream(strResources);
var resourceReader = new ResourceReader(rStream);
var items = resourceReader.OfType<DictionaryEntry>();
var stream = items.First(x => (x.Key as string) == resName.ToLower()).Value;
return (UnmanagedMemoryStream)stream;
}
var file = GetResourceStream("appValues.xml");
Lorsque vous ajoutez un fichier à un projet Visual Studio, il n'est pas copié par défaut sur la sortie générée. En tant que tel, vous devez définir pour copier le fichier ou le faire manuellement.
Pour que le fichier soit automatiquement copié, sélectionnez-le dans l'explorateur de solutions, cliquez avec le bouton droit de la souris et sélectionnez Propriétés. Mettez à jour la valeur de "Copier dans le répertoire de sortie" sur "Copier toujours". Cela garantira qu'une copie du fichier est disponible au moment de l'exécution dans un sous-dossier de la solution résultante.
Vous pouvez ensuite charger le fichier en utilisant quelque chose comme:
string path = System.Io.Path.Combine(Application.StartupPath, @"\service\AppValues.xml");
XDocument doc = XDocument.Load(path);