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

Posted

技术标签:

【中文标题】如何从 app.config 中读取自定义 XML?【英文标题】:How to Read Custom XML from the app.config? 【发布时间】:2010-11-12 00:38:44 【问题描述】:

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

我该怎么做?

XML 如下:

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

【问题讨论】:

您丢失了您的 XML,或者它被某种方式吞噬了。 不要纠结于您的 XML 应该 在 app.config 中的外观。开心就好。 【参考方案1】:

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

此方法更进一步,将对象反序列化到内存中。我只是从我的项目中复制代码,但如果你想要的只是 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 序列化到的对象类型,然后传递您要查找的部分(在本例中为 @987654325 @。

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

【讨论】:

这看起来像一个稳定的链接:sites.google.com/site/craigandera/craigs-stuff/clr-workings/…。我在他的方法中看到的唯一问题是,如果你有大量这样的部分,它就会被类型声明所占据。但是你可以通过将它们粘合成一个部分并制作一个更大的类型来解决这个缺点。因此,它看起来很可行,而且是一个非常优雅的 hack。 谢谢!这很有帮助。 Phil Haack 基于 Craig 的方法做了一个更新版本,支持在文件更改时重新加载配置。格式在转移到他的新博客时全部损坏,但链接是haacked.com/archive/2004/06/24/… IConfigurationSectionHandler 如msdn.microsoft.com/query/… 所述已被弃用很长时间。【参考方案2】:

你想要做的是阅读Custom Configuration Sections。

【讨论】:

祝那些勇敢的菜鸟们好运!对于新开发人员来说,它们可能会让人非常困惑。 没错,.NET 1.x 中实现接口并使用 XML 的方式更容易理解,IMO。 我发现这个关于 codeproject (codeproject.com/KB/dotnet/mysteriesofconfiguration.aspx) 的系列文章很好地解释了这个主题。【参考方案3】:

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

【讨论】:

+1 ConfigurationSection.DeserializeSection 是一个救命稻草,因为它更容易迭代相关的 XML cfg 节点而不是处理 w/ System.Configuration 各种注释,并且仍然公开静态/高度安全的配置项【参考方案4】:

我在 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>

【讨论】:

在 Xml 中布置你的类型然后从它自动生成一个类似乎非常引人注目。您如何“从中创建 app.XSD”?当您将这些说明添加到您的答案时 +1 ;) 您可以在 VS 中创建 XSD。创建一个示例 XML 文件,然后在 VS2017 的工具栏上,有一个带有“创建架构”选项的“XML”菜单。有关 MSDN 的更多信息,请访问 msdn.microsoft.com/en-us/library/ms255829.aspx

以上是关于如何从 app.config 中读取自定义 XML?的主要内容,如果未能解决你的问题,请参考以下文章

app.config (C#) 中的嵌套自定义元素

C# app.config 遍历读取自定义节点

如何在 app.config 中提供 xml 文件源并从 winform 中写入/读取这些 xml 文件?

App.config自定义节点读取

在Web.config或App.config中的添加自定义配置

在Web.config或App.config中的添加自定义配置