Как загрузить файл конфигурации программно

Предположим, у меня есть настраиваемый файл конфигурации, который соответствует настраиваемым элементам ConfigurationSection и Config. Эти классы конфигурации хранятся в библиотеке.

Файл конфигурации выглядит так

<?xml version="1.0" encoding="utf-8" ?>
<Schoool Name="RT">
  <Student></Student>
</Schoool>

Как я могу программно загрузить и использовать этот файл конфигурации из кода?

Я не хочу использовать необработанную обработку XML, но использую уже определенные классы конфигурации.


person R.D    schedule 26.06.2009    source источник
comment
почему ты не выбираешь выбранный ответ?   -  person Royi Namir    schedule 13.11.2012


Ответы (4)


Вам придется адаптировать его к вашим требованиям, но вот код, который я использую в одном из моих проектов для этого:

var fileMap = new ConfigurationFileMap("pathtoconfigfile");
var configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
var sectionGroup = configuration.GetSectionGroup("applicationSettings"); // This is the section group name, change to your needs
var section = (ClientSettingsSection)sectionGroup.Sections.Get("MyTarget.Namespace.Properties.Settings"); // This is the section name, change to your needs
var setting = section.Settings.Get("SettingName"); // This is the setting name, change to your needs
return setting.Value.ValueXml.InnerText;

Обратите внимание, что я читаю действующий файл конфигурации .net. Я использую этот код для чтения файла конфигурации EXE из библиотеки DLL. Я не уверен, работает ли это с примером файла конфигурации, который вы указали в своем вопросе, но это должно быть хорошим началом.

person Marc    schedule 29.08.2011

Ознакомьтесь с серией из трех частей Джона Ристы о настройке .NET 2.0 на CodeProject.

Настоятельно рекомендуется, хорошо написано и очень полезно!

На самом деле вы не можете загрузить какой-либо XML-фрагмент - вы можете загрузить полный отдельный файл конфигурации, который выглядит как app.config.

Если вы хотите создать и спроектировать свои собственные настраиваемые разделы конфигурации, вам обязательно стоит ознакомиться с конструктором разделов конфигурации на CodePlex - надстройке Visual Studio, которая позволяет визуально проектировать разделы конфигурации и генерировать для вас весь необходимый сантехнический код.

person marc_s    schedule 26.06.2009
comment
Это полезно, но не является ответом на вопрос. Я прочитал все три статьи и все еще ничего не понял. - person Andrew Myhre; 12.08.2011
comment
@Andrew Myhre: Я пытался сказать: вместо того, чтобы катать свое собственное и заново изобретать колесо, используйте то, что уже доступно в .NET framework. Хватит изобретать колесо! Колес уже достаточно - используйте их! - person marc_s; 12.08.2011

Атрибут configSource позволяет переместить любой элемент конфигурации в отдельный файл. В вашем основном app.config вы должны сделать что-то вроде этого:

<configuration>
  <configSections>
    <add name="schools" type="..." />
  </configSections>

  <schools configSource="schools.config />
</configuration>
person Jørn Schou-Rode    schedule 26.06.2009
comment
Верно, но даже в этом случае вам необходимо создать свой собственный элемент конфигурации для части определения ‹configSections›. - person marc_s; 26.06.2009
comment
@marc_s: когда я читал OP, у автора уже есть Custom-defined ConfigurationSection, но он не уверен, как использовать его в качестве Custom Config File. Хотя я могу ошибаться. - person Jørn Schou-Rode; 26.06.2009
comment
Вы могли быть правы :-) Думаю, я недостаточно внимательно прочитал вопрос - mea culpa. - person marc_s; 26.06.2009

Следующий код позволит вам загружать контент из XML в объекты. В зависимости от источника, app.config или другого файла, используйте соответствующий загрузчик.

using System.Collections.Generic;
using System.Xml.Serialization;
using System.Configuration;
using System.IO;
using System.Xml;

class Program
{
    static void Main(string[] args)
    {
        var section = SectionSchool.Load();
        var file = FileSchool.Load("School.xml");
    }
}

Загрузчик файлов:

public class FileSchool
{
    public static School Load(string path)
    {
        var encoding = System.Text.Encoding.UTF8;
        var serializer = new XmlSerializer(typeof(School));

        using (var stream = new StreamReader(path, encoding, false))
        {
            using (var reader = new XmlTextReader(stream))
            {
                return serializer.Deserialize(reader) as School;
            }
        }
    }
}

Загрузчик разделов:

public class SectionSchool : ConfigurationSection
{
    public School Content { get; set; }

    protected override void DeserializeElement(XmlReader reader, bool serializeCollectionKey)
    {
        var serializer = new XmlSerializer(typeof(School)); // works in     4.0
        // var serializer = new XmlSerializer(type, null, null, null, null); // works in 4.5.1
        Content = (Schoool)serializer.Deserialize(reader);
    }
    public static School Load()
    {
        // refresh section to make sure that it will load
        ConfigurationManager.RefreshSection("School");
        // will work only first time if not refreshed
        var section = ConfigurationManager.GetSection("School") as SectionSchool;

        if (section == null)
            return null;

        return section.Content;
    }
}

Определение данных:

[XmlRoot("School")]
public class School
{
    [XmlAttribute("Name")]
    public string Name { get; set; }

    [XmlElement("Student")]
    public List<Student> Students { get; set; }
}

[XmlRoot("Student")]
public class Student
{
    [XmlAttribute("Index")]
    public int Index { get; set; }
}

Содержимое app.config

<?xml version="1.0"?>
<configuration>

  <configSections>
    <section name="School" type="SectionSchool, ConsoleApplication1"/>
  </configSections>

  <startup> 
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>

  <School Name="RT">
    <Student Index="1"></Student>
    <Student />
    <Student />
    <Student />
    <Student Index="2"/>
    <Student />
    <Student />
    <Student Index="3"/>
    <Student Index="4"/>
  </School>

</configuration>

Содержимое XML-файла:

<?xml version="1.0" encoding="utf-8" ?>
<School Name="RT">
  <Student Index="1"></Student>
  <Student />
  <Student />
  <Student />
  <Student Index="2"/>
  <Student />
  <Student />
  <Student Index="3"/>
  <Student Index="4"/>
</School>

опубликованный код был проверен в Visual Studio 2010 (.Net 4.0). Он будет работать в .Net 4.5.1, если вы измените конструкцию серилиазера с

new XmlSerializer(typeof(School))

to

new XmlSerializer(typeof(School), null, null, null, null);

Если предоставленный образец запускается вне отладчика, он будет работать с простейшим конструктором, однако при запуске из IDE VS2013 с отладкой потребуется изменение конструктора, иначе возникнет исключение FileNotFoundException (по крайней мере, так было в моем случае).

person recineshto    schedule 17.06.2015