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?
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.)
Définissez la propriété "Build Action" pour le fichier XML sur "Embedded Resource".
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.....
.
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).
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
}
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();
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)
@ 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);