Чтение встроенного XML-файла c # - PullRequest
60 голосов
/ 12 мая 2010

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

Есть идеи?

Ответы [ 6 ]

95 голосов
/ 12 мая 2010
  1. Убедитесь, что файл XML является частью вашего проекта .csproj. (Если вы видите это в обозревателе решений, вы в порядке.)

  2. Установите для свойства «Построить действие» для файла XML значение «Встроенный ресурс».

  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");

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

Обновление

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

30 голосов
/ 12 мая 2010

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

13 голосов
/ 12 мая 2010

Установите для параметра «Действие построения» значение «Встроенный ресурс», а затем введите следующее:

using (Stream stream = typeof(MyClass).Assembly.GetManifestResourceStream("MyNameSpace.Something.xml")) {
    //Read the stream
}
8 голосов
/ 12 мая 2010

Вы можете использовать Reflector (бесплатно http://www.red -gate.com / products / refleor / ), чтобы найти путь к встроенному 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();
3 голосов
/ 12 мая 2010
  1. Добавить файл в проект.
  2. Установите для свойства «Построить действие» значение «Встроенный ресурс».
  3. Доступ к нему таким образом:

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

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

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

1 голос
/ 24 сентября 2018

@ 3Dave действительно помог (с учетом голосов), однако мой помощник по ресурсам находился в другой сборке, поэтому я сделал следующее

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

Вызывается

GetResourceFileText("YourFileNameHere.ext", Assembly.GetExecutingAssembly().GetName().Name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...