如何从app.config读取自定义XML?

时间:2009-07-18 21:31:14

标签: c# .net windows-services app-config

我想从C#windows服务的app.config中读取自定义XML部分。

我该如何解决?

XML如下:

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

4 个答案:

答案 0 :(得分:14)

在我开发的项目中,我使用类似于我发现的配置。我相信这篇文章被称为我需要的最后一个配置部分处理程序(我找不到工作链接,也许有人可以为我链接它)。

此方法将您想要做的更进一步,并实际将对象反序列化到内存中。我只是从我的项目中复制代码,但如果您想要的只是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到的对象类型,并传递您正在寻找的部分(在本例中为{{ 1}}。

SearchSettings

现在,您只需要App.config文件即可。我选择将我分成单独的文件(每个部分1个文件),以便更轻松地管理配置。您可以定义一个部分,为其命名,并定义类型(无论您在上面列出的是什么类型)和程序集的名称。

App.config中:

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

现在,剩下的就是要反序列化的配置文件。这里重要的是该块与您的节名称匹配,您的类型是它应该反序列化的任何对象,以及程序集名称。

<?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,那么您需要做的就是修改处理该部分的Object以返回XML或执行您需要做的任何事情。

答案 1 :(得分:5)

您想要做的是阅读Custom Configuration Sections

答案 2 :(得分:4)

由于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);
    }
}

答案 3 :(得分:0)

我在config.app中使用自定义xml。从中创建并创建app.XSD。 XSD文件包含config.app文件的架构。 然后可以使用“xsd.exe”将XSD文件转换为vb类或C#类文件。 现在您要做的就是将配置文件反序列化为类。

<?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>