Reading embedded XML file c#
C#XmlC# Problem Overview
How can I read from an embedded XML file - an XML file that is part of a c# project? I've added a XML file to my project and I want to read from it. I want the XML file to compile with the project because I don't want that it will be a resource which the user can see.
Any idea?
C# Solutions
Solution 1 - C#
-
Make sure the XML file is part of your .csproj project. (If you can see it in the solution explorer, you're good.)
-
Set the "Build Action" property for the XML file to "Embedded Resource".
-
Use the following code to retrieve the file contents at runtime:
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; }
Whenever you want to read the file contents, just use
string fileContents = GetResourceTextFile("myXmlDoc.xml");
Note that "assembly.folder" should be replaced with the project name and folder containing the resource file.
Update
Actually, assembly.folder
should be replaced by the namespace in which a class created in the same folder as the XML file would have by default. This is typically defaultNamespace.folder0.folder1.folder2.....
.
Solution 2 - C#
You can also add the XML file as a Resource and then address its contents with Resources.YourXMLFilesResourceName
(as a string, i.e. using a StringReader).
Solution 3 - C#
Set the Build Action to Embedded Resource, then write the following:
using (Stream stream = typeof(MyClass).Assembly.GetManifestResourceStream("MyNameSpace.Something.xml")) {
//Read the stream
}
Solution 4 - C#
You can use Reflector (free from http://www.red-gate.com/products/reflector/) to find the path to the embedded XML file.
Then, it's just a matter of
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();
Solution 5 - C#
-
Add the file to the project.
-
Set the "Build Action" property to "Embedded Resource".
-
Access it this way:
GetType().Module.Assembly.GetManifestResourceStream("namespace.folder.file.ext")
Notice that the resource name string is the name of the file, including extension, preceded by the default namespace of the project. If the resource is inside a folder, you also have to include it in the string.
(from http://www.dotnet247.com/247reference/msgs/1/5704.aspx, but I used it pesonally)
Solution 6 - C#
@3Dave really helped (up vote given), however my resource helper was in a different assembly so I did the below
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;
}
Called by
GetResourceFileText("YourFileNameHere.ext", Assembly.GetExecutingAssembly().GetName().Name);