web-dev-qa-db-fra.com

Lecture du fichier XML incorporé c #

Comment puis-je lire à partir d'un fichier XML incorporé - un fichier XML qui fait partie d'un projet c #? J'ai ajouté un fichier XML à mon projet et je veux en lire. Je veux que le fichier XML soit compilé avec le projet parce que je ne veux pas que ce soit une ressource que l'utilisateur puisse voir.

Une idée?

60
Pila
  1. Assurez-vous que le fichier XML fait partie de votre projet .csproj. (Si vous pouvez le voir dans l'Explorateur de solutions, vous êtes bon.)

  2. Définissez la propriété "Build Action" pour le fichier XML sur "Embedded Resource".

  3. Utilisez le code suivant pour récupérer le contenu du fichier lors de l'exécution:

    public string GetResourceTextFile(string filename)
    {
        string result = string.Empty;
    
        using (Stream stream = this.GetType().Assembly.
                   GetManifestResourceStream("Assembly.folder."+filename))
        {
            using (StreamReader sr = new StreamReader(stream))
            {
                result = sr.ReadToEnd();
            }
        }
        return result;
    }
    

Chaque fois que vous souhaitez lire le contenu du fichier, utilisez simplement

string fileContents = GetResourceTextFile("myXmlDoc.xml");

Notez que "Assembly.folder" doit être remplacé par le nom du projet et le dossier contenant le fichier de ressources.

Mise à jour

Réellement, Assembly.folder doit être remplacé par l'espace de noms dans lequel une classe créée dans le même dossier que le fichier XML aurait par défaut. C'est généralement defaultNamespace.folder0.folder1.folder2......

96
3Dave

Vous pouvez également ajouter le fichier XML en tant que ressource, puis adresser son contenu avec Resources.YourXMLFilesResourceName (sous forme de chaîne, c'est-à-dire en utilisant un StringReader).

30
sunside

Définissez l'action de génération sur Ressource intégrée, puis écrivez ce qui suit:

using (Stream stream = typeof(MyClass).Assembly.GetManifestResourceStream("MyNameSpace.Something.xml")) {
    //Read the stream
}
13
SLaks

Vous pouvez utiliser Reflector (gratuit depuis http://www.red-gate.com/products/reflector/ ) pour trouver le chemin d'accès au fichier XML incorporé.

Ensuite, c'est juste une question de

Assembly a = typeof(Assembly.Namespace.Class).Assembly;

Stream s = a.GetManifestResourceStream("Assembly.Namespace.Path.To.File.xml");
XmlDocument mappingFile = new XmlDocument();
mappingFile.Load(s);
s.Close();
8
Jamie
  1. Ajoutez le fichier au projet.
  2. Définissez la propriété "Build Action" sur "Embedded Resource".
  3. Accédez-y de cette façon:

    GetType().Module.Assembly.GetManifestResourceStream("namespace.folder.file.ext")
    

Notez que la chaîne de nom de ressource est le nom du fichier, extension comprise, précédé de l'espace de noms par défaut du projet. Si la ressource se trouve dans un dossier, vous devez également l'inclure dans la chaîne.

(à partir de http://www.dotnet247.com/247reference/msgs/1/5704.aspx , mais je l'ai utilisé à la légère)

3
Grzenio

@ 3Dave a vraiment aidé (vote majoré), mais mon assistant de ressources était dans une assemblée différente, j'ai donc fait ce qui suit

public string GetResourceFileText(string filename, string assemblyName)
    {
        string result = string.Empty;

        using (Stream stream = 
            System.Reflection.Assembly.Load(assemblyName).GetManifestResourceStream($"{assemblyName}.{filename}"))
        {
            using (StreamReader sr = new StreamReader(stream))
            {
                result = sr.ReadToEnd();
            }
        }
        return result;
    }

Appelé par

GetResourceFileText("YourFileNameHere.ext", Assembly.GetExecutingAssembly().GetName().Name);
1
Toby Simmerling