2010-05-12 17 views
52

¿Cómo puedo leer un archivo XML incrustado, un archivo XML que forma parte de un proyecto de C#? He agregado un archivo XML a mi proyecto y quiero leer de él. Quiero que el archivo XML se compile con el proyecto porque no quiero que sea un recurso que el usuario pueda ver.Lectura de archivos XML incrustados C#

¿Alguna idea?

+1

pregunta similar: http: // stackoverflow.com/questions/3314140/how-to-read-embedded-resource-text-file – ClearCloud8

Respuesta

84
  1. Asegúrese de que el archivo XML es parte de su proyecto .csproj. (Si puede verlo en el explorador de soluciones, está bien.)

  2. Establezca la propiedad "Crear acción" para el archivo XML en "Recurso incrustado".

  3. utilizar el siguiente código para recuperar el contenido del archivo en tiempo de ejecución:

    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; 
    } 
    

Cada vez que desee leer el contenido del archivo, sólo tiene que utilizar

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

Tenga en cuenta que "el montaje. carpeta "debe reemplazarse con el nombre del proyecto y la carpeta que contiene el archivo de recursos.

actualización

En realidad, assembly.folder debe sustituirse por el espacio de nombres en el que una clase creada en la misma carpeta que el archivo XML tendría por defecto. Esto es típicamente defaultNamespace.folder0.folder1.folder2......

+4

La "Nota" al final de su respuesta parece ser incorrecta. Vea esta respuesta (http://stackoverflow.com/a/3314213/940783) que indica que debe ingresar el espacio de nombre predeterminado de su proyecto, no solo el nombre del proyecto. Solo usar el nombre del ensamblado del proyecto no me funcionaba. – ClearCloud8

+0

@ ClearCloud8 buena llamada. El espacio de nombre predeterminado se establece automáticamente en el nombre del proyecto, pero eso no es un requisito y, por lo tanto, no se debe suponer. –

+7

Si necesita enumerar todos los recursos que se cargan, simplemente mire 'GetType(). Assembly.GetManifestResourceNames()' – ogrim

12

Conjunto del Acción de generación en Recurso incrustado, a continuación, escribir lo siguiente:

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

Éste trabajó para mí. – Mike

2
  1. agregar el archivo al proyecto.
  2. Establezca la propiedad "Acción de compilación" en "Recurso incrustado".
  3. acceso de esta manera:

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

en cuenta que la cadena de nombre de recurso es el nombre del archivo, incluyendo la extensión , precedido por el nombre por defecto del proyecto. Si el recurso está dentro de una carpeta, también debe incluirlo en la cadena .

(de http://www.dotnet247.com/247reference/msgs/1/5704.aspx, pero lo usé pesonally)

26

También puede agregar el archivo XML como un recurso y luego abordar su contenido con Resources.YourXMLFilesResourceName (como una cadena, es decir, utilizando un StringReader).

+3

¡Eso es significativamente más fácil! –

+2

Lo siento, pero ¿de dónde viene "Resources"? – stt106

+0

Implícitamente asumí Visual Studio aquí; esa clase debe autogenerarse tan pronto como marque un archivo como recurso incrustado. – sunside

8

Puede usar Reflector (gratis desde http://www.red-gate.com/products/reflector/) para encontrar la ruta al archivo XML incrustado.

Entonces, es sólo una cuestión 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

Debe cerrar la secuencia. Además, escribir 'typeof (SomeType)' .Assembly' será _sustancialmente_ más rápido. – SLaks

+0

Hecho. Grandes puntos. – Jamie

+4

Debe cerrar la secuencia usando una instrucción 'using'. – SLaks