Как прочитать пользовательский XML из app.config? - PullRequest
9 голосов
/ 19 июля 2009

Я хочу прочитать пользовательский раздел XML из app.config службы C # windows.

Как мне это сделать?

XML ниже:

<Books>
<Book name="name1" title="title1"/>
<Book name="name2" title="title2"/>
</Books>

Ответы [ 4 ]

14 голосов
/ 19 июля 2009

В проекте, который я разработал, я использую что-то похожее для конфигурации, которую нашел. Я считаю, что статья была названа последним обработчиком раздела конфигурации, который мне когда-либо понадобится (я не могу найти рабочую ссылку, возможно, кто-то может связать ее для меня).

Этот метод делает то, что вы хотите сделать, на один шаг дальше и фактически десериализует объект в память. Я просто копирую код из своего проекта, но сделать шаг назад очень просто, если вам нужен только 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 или сделать все, что вам нужно.

5 голосов
/ 19 июля 2009

Что вы хотите сделать, это прочитать в Разделы пользовательской конфигурации .

4 голосов
/ 19 октября 2015

Поскольку IConfigurationSectionHandler устарело, я подумал, что стоит упомянуть, что вы все еще можете реализовать чисто сериализованный раздел, просто переопределив ConfigurationSection.DeserializeSection и не вызывая базовую реализацию.

Вот очень простой пример, который я часто повторяю. Простой раздел конфигурации, который загружает граф объектов из встроенного XAML. (Естественно, вы можете реализовать с XmlSerializer вместо)

using System.Configuration;
using System.Xaml;
using System.Xml;

...

public class XamlConfigurationSection<T> : ConfigurationSection
{
    public static XamlConfigurationSection<T> Get(string sectionName)
    {
        return (XamlConfigurationSection<T>)ConfigurationManager.GetSection(sectionName);
    }

    public T Content { get; set; }

    protected override void DeserializeSection(XmlReader xmlReader)
    {
        xmlReader.Read();
        using (var xamlReader = new XamlXmlReader(xmlReader))
            Content = (T)XamlServices.Load(xamlReader);
    }
}
0 голосов
/ 11 марта 2010

Я использую пользовательский XML в моем config.app. файл и создайте app.XSD из него. Файл XSD включает в себя схему файла config.app. Затем XSD-файл можно преобразовать в класс VB или файл класса C # с помощью «xsd.exe». Теперь все, что вам нужно сделать, это десериализовать configfile в класс.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="CustomConfig" type="Object" />
    </configSections>

    <CustomConfig>
        <ActiveEnvironment>QAS</ActiveEnvironment>
        <Environments>
            <Environment name ="PRD" log="Y">
            </Environment>
            <Environment name ="QAS" log="N">
            </Environment>
            <Environment name ="DEV" log="Y">
            </Environment>
        </Environments>
    </CustomConfig>

</configuration>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...