В проекте, который я разработал, я использую что-то похожее для конфигурации, которую нашел. Я считаю, что статья была названа последним обработчиком раздела конфигурации, который мне когда-либо понадобится (я не могу найти рабочую ссылку, возможно, кто-то может связать ее для меня).
Этот метод делает то, что вы хотите сделать, на один шаг дальше и фактически десериализует объект в память. Я просто копирую код из своего проекта, но сделать шаг назад очень просто, если вам нужен только XML.
Сначала вам нужно определить класс, который обрабатывает ваши настройки.
using System;
using System.Configuration;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.XPath;
namespace Ariel.config
{
class XmlSerializerSectionHandler : IConfigurationSectionHandler
{
#region IConfigurationSectionHandler Members
public object Create(object parent, object configContext, XmlNode section)
{
XPathNavigator nav = section.CreateNavigator();
string typename = (string)nav.Evaluate("string(@type)");
Type t = Type.GetType(typename);
XmlSerializer ser = new XmlSerializer(t);
return ser.Deserialize(new XmlNodeReader(section));
}
#endregion
}
}
Теперь, скажем, вы хотите загрузить раздел конфигурации ... очень просто, приведите к типу объекта, к которому вы хотите XML Serialize, и пропустите нужный раздел (в данном случае SearchSettings
.
try
{
config = (Eagle.Search.SearchSettings)ConfigurationSettings.GetConfig("SearchSettings");
}
catch (System.Configuration.ConfigurationException ex)
{
syslog.FatalException("Loading search configuration failed, you likely have an error", ex);
return;
}
Теперь все, что вам нужно, это ваш файл App.config. Я решил разбить мой файл на отдельные файлы (по 1 файлу на раздел), чтобы немного упростить управление конфигурацией. Вы определяете раздел, даете ему имя и определяете тип (как бы вы ни называли класс, указанный выше) и имя сборки.
App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="SearchSettings" type="Ariel.config.XmlSerializerSectionHandler, Ariel"/>
</configSections>
<SearchSettings configSource="Config\Search.config" />
</configuration>
Теперь все, что осталось, - это файл конфигурации, который нужно десериализовать. Здесь важно, чтобы блок соответствовал имени вашего раздела, а ваш тип - это любой объект, к которому он должен десериализоваться, и имя сборки.
<?xml version="1.0" encoding="utf-8" ?>
<SearchSettings type="Eagle.Search.SearchSettings, Eagle">
<NumThreads>4</NumThreads>
</SearchSettings>
Если вы просто хотите получить чистый необработанный XML, все, что вам нужно сделать, - это изменить объект, который обрабатывает раздел, для возврата XML или сделать все, что вам нужно.