2010-05-12 3 views
52

Как я могу прочитать из встроенного XML-файла - XML-файл, который является частью проекта C#? Я добавил файл XML в свой проект, и я хочу прочитать его. Я хочу, чтобы XML-файл был скомпилирован с проектом, потому что я не хочу, чтобы он был ресурсом, который пользователь может видеть.Чтение встроенного XML-файла C#

Любая идея?

+1

подобный вопрос: HTTP: // StackOverflow.com/questions/3314140/how-to-read-embedded-resource-text-file – ClearCloud8

ответ

84
  1. Убедитесь, что XML-файл является частью вашего проекта .csproj. (Если вы можете увидеть его в обозревателе решений, у вас все хорошо.)

  2. Установите свойство «Build Action» для XML-файла на «Embedded Resource».

  3. Используйте следующий код для извлечения содержимого файла во время выполнения:

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

Всякий раз, когда вы хотите прочитать содержимое файла, просто использовать

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

Обратите внимание, что «сборка. папка "должна быть заменена именем проекта и папкой, содержащей файл ресурсов.

Update

На самом деле, assembly.folder следует заменить на пространство имен, в котором класс создан в той же папке, что и файл XML будет иметь по умолчанию. Обычно это defaultNamespace.folder0.folder1.folder2......

+4

«Примечание» в конце вашего ответа представляется неправильным. См. Этот ответ (http://stackoverflow.com/a/3314213/940783), в котором говорится, что вы должны ввести пространство имен по умолчанию для своего проекта, а не только имя проекта. Просто использование имени сборки проекта не работало для меня. – ClearCloud8

+0

@ ClearCloud8 хороший звонок. По умолчанию пространство имен автоматически устанавливается на имя проекта, но это не является обязательным требованием и, следовательно, не следует предполагать. –

+7

Если вам нужно перечислить все загруженные ресурсы, просто посмотрите на 'GetType(). Assembly.GetManifestResourceNames()' – ogrim

12

Установите Сложение Действие Внедренный ресурс, а затем написать следующее:

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

Это работало для меня. – Mike

2
  1. Добавить файл в проект.
  2. Установите свойство «Build Action» в «Embedded Resource».
  3. Access это следующим образом:

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

Обратите внимание, что строка имя ресурса является имя файла, включая расширение, которому предшествует пространство имен по умолчанию проекта. Если ресурс находится внутри папки, вы также должны включить его в строку .

(от http://www.dotnet247.com/247reference/msgs/1/5704.aspx, но я использовал его pesonally)

26

Вы также можете добавить файл XML как ресурс, а затем обратиться его содержимое Resources.YourXMLFilesResourceName (в виде строки, то есть с использованием StringReader).

+3

Это значительно проще! –

+2

Прошу прощения, но откуда взялись «Ресурсы»? – stt106

+0

Здесь я подразумеваю Visual Studio здесь; этот класс должен быть автогенерирован, как только вы помечаете файл как встроенный ресурс. – sunside

8

Вы можете использовать Reflector (бесплатно от http://www.red-gate.com/products/reflector/), чтобы найти путь к встроенному XML-файлу.

Тогда, это просто вопрос

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

Вы должны закрыть поток. Кроме того, запись 'typeof (SomeType)' .Assembly' будет _substantially_ быстрее. – SLaks

+0

Готово. Отличные очки. – Jamie

+4

Вы должны закрыть поток, используя инструкцию 'using'. – SLaks

Смежные вопросы