63 votes

Lecture d'un fichier XML intégré c#

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

Une idée ?

1 votes

105voto

David Lively Points 16026
  1. Assurez-vous que le fichier XML fait partie de votre projet .csproj. (Si vous pouvez le voir dans l'explorateur de solutions, c'est bon).

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

  3. Utilisez le code suivant pour récupérer le contenu du fichier au moment 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;
    }

Lorsque vous voulez lire le contenu d'un 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 ressource.

Mise à jour

En fait, assembly.folder doit être remplacé par l'espace de nom dans lequel une classe créée dans le même dossier que le fichier XML aurait par défaut. Il s'agit généralement de defaultNamespace.folder0.folder1.folder2..... .

4 votes

La "Note" à la fin de votre réponse semble être incorrecte. Voir cette réponse ( stackoverflow.com/a/3314213/940783 ) qui stipule que vous devez entrer le Default Namespace de votre projet, et pas seulement le nom du projet. L'utilisation du nom de l'assemblage du projet ne fonctionne pas pour moi.

0 votes

@ClearCloud8 bien vu. L'espace de noms par défaut est automatiquement défini sur le nom du projet, mais ce n'est pas une obligation et il ne faut donc pas le supposer.

11 votes

Si vous avez besoin de lister toutes les ressources qui sont chargées, il suffit de regarder GetType().Assembly.GetManifestResourceNames()

30voto

Markus Points 933

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

3 votes

Je suis désolé, mais d'où vient le terme "ressources" ?

0 votes

J'ai supposé implicitement Visual Studio ici ; cette classe devrait être autogénérée dès que vous marquez un fichier comme ressource intégrée.

0 votes

@sunside merci pour la réponse. Il n'a pas généré la classe Resources dans mon cas ; est-ce parce que j'intègre le fichier xml à une classe Test ? Je ne vois pas pourquoi cela devrait être important.

15voto

SLaks Points 391154

Définissez l'action de construction sur Embedded Resource, puis écrivez ce qui suit :

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

11voto

Jamie Points 786

Vous pouvez utiliser Reflector (gratuit à partir de 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();

1 votes

Vous devriez fermer le flux. De plus, écrire typeof(SomeType) .Assembly` sera substantiellement plus rapide.

4 votes

Vous devez fermer le flux en utilisant un using déclaration.

4voto

Grzenio Points 16802
  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")

Remarquez que la chaîne du nom de la ressource est le nom du fichier, y compris l'extension, précédé de l'espace de nom par défaut du projet. Si la ressource se trouve dans un dossier, vous devez également l'inclure dans la chaîne de caractères chaîne de caractères.

(de http://www.dotnet247.com/247reference/msgs/1/5704.aspx mais je l'ai utilisé personnellement)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X