Как загрузить файл конфигурации программно
Предположим, у меня есть пользовательский файл конфигурации, который соответствует настраиваемым элементам ConfigurationSection и Config. Эти классы конфигурации хранятся в библиотеке.
Файл Config выглядит так:
<?xml version="1.0" encoding="utf-8" ?>
<Schoool Name="RT">
<Student></Student>
</Schoool>
Как я могу программно загрузить и использовать этот файл конфигурации из кода?
Я не хочу использовать необработанную обработку XML, но использую уже определенные классы конфигурации.
Ответы
Ответ 1
Вам нужно будет адаптировать его для своих требований, но здесь код, который я использую в одном из моих проектов, можно сделать именно так:
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. Я не уверен, что это работает с примером файла конфигурации, который вы указали в своем вопросе, но это должно быть хорошим началом.
Ответ 2
Ознакомьтесь с трехстраничной серией Jon Rista по конфигурации .NET 2.0 на CodeProject.
Очень рекомендуется, хорошо написано и очень полезно!
Вы не можете загрузить какой-либо фрагмент XML - то, что вы можете загрузить, представляет собой полный, отдельный файл конфигурации, который выглядит и выглядит как app.config.
Если вы хотите создавать и создавать свои собственные настраиваемые разделы конфигурации, вам обязательно нужно также проверить конструктор раздела конфигурации на CodePlex - a Visual Studio addin, который позволяет визуально создавать разделы конфигурации и иметь для вас все необходимые сантехнические коды.
Ответ 3
Атрибут configSource
позволяет перемещать любой элемент конфигурации в отдельный файл. В вашем главном app.config вы бы сделали что-то вроде этого:
<configuration>
<configSections>
<add name="schools" type="..." />
</configSections>
<schools configSource="schools.config />
</configuration>
Ответ 4
Следующий код позволит вам загружать контент из 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, если вы измените конструкцию seriliazer из
new XmlSerializer(typeof(School))
к
new XmlSerializer(typeof(School), null, null, null, null);
Если предоставленный образец запускается за пределами отладчика, он будет работать с простейшим конструктором, однако, если он будет запущен из ID2 VS2013 с отладкой, тогда потребуется изменить конструктор, иначе произойдет FileNotFoundException (по крайней мере, это было в моем случае).