web-dev-qa-db-fra.com

Chargement d'un chemin de fichier XML en C #

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?

8
Tobias Roland

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 ... 

  1. Utilisez un chemin absolu, mais vous ne le souhaitez pas 
  2. Définissez votre fichier à copier dans votre répertoire de travail lors de la construction. Vous faites cela en modifiant les propriétés du fichier dans l'explorateur de solutions. Merci à T.Roland dans les commentaires ci-dessous: Set Copier dans le répertoire de sortie à copier si plus récent et définir Action de construction à une ressource incorporée;
  3. Modifiez le répertoire de travail de votre solution pour qu'il devienne la racine de votre solution Ce fil propose différentes manières de le faire. 
12
Tyler Lee

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.

4
Sarath Rachuri

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.

1
jlew

vérifie ça 

XDocument document = XDocument.Load(@"..\service\AppValues.xml");
0
K3rnel31

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

0
M. Bhavani

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");
0
guymid

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);
0
Kami