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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# app.config 遍历读取自定义节点相关的知识,希望对你有一定的参考价值。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

<configSections>
<sectionGroup name="Serial">
<section name="ReceiveSerial" type="System.Configuration.NameValueSectionHandler"/>
<section name="SendSerial" type="System.Configuration.NameValueSectionHandler"/>
</sectionGroup>
</configSections>

<Serial>
<ReceiveSerial>
<add key="PortName" value="COM1" />
<add key="BaudRate" value="9600" />
<add key="DataBits" value="8" />
<add key="Device" value="AD_1000" />
<add key="IsOpne" value="YES" />
</ReceiveSerial>
<SendSerial>
<Serial1>
<add key="PortName" value="COM5" />
<add key="BaudRate" value="9600" />
<add key="DataBits" value="8" />
<add key="Device" value="AD_1000" />
<add key="IsOpne" value="YES" />
</Serial1>
<Serial2>
<add key="PortName" value="COM7" />
<add key="BaudRate" value="9600" />
<add key="DataBits" value="8" />
<add key="Device" value="AD_1000" />
<add key="IsOpne" value="YES" />
</Serial2>
</SendSerial>
</Serial>
</configuration>

读取ReceiveSerial可以用var nc = (NameValueCollection)ConfigurationSettings.GetConfig("Serial/ReceiveSerial");

要读取SendSerial下面的不固定个数的Serial1、Serial2等等节点的信息怎么写?

你这个xml设计的有问题。建议设计为

     <Serial id="1">
       <add key="PortName" value="COM7" />
       <add key="BaudRate" value="9600" />
       <add key="DataBits" value="8" />
       <add key="Device" value="AD_1000" />
       <add key="IsOpne" value="YES" />
     </Serial>
    <Serial id="2">
       <add key="PortName" value="COM7" />
       <add key="BaudRate" value="9600" />
       <add key="DataBits" value="8" />
       <add key="Device" value="AD_1000" />
       <add key="IsOpne" value="YES" />
     </Serial>

处理起来就简单了

追问

麻烦你 能写一下 你这种方式读取的方法吗? 谢谢

追答

这个不是直接读取的,简易你看一下ConfigurationSection的使用说明。可以直接将配置文件反序列化为ConfigurationSection对象的。

参考技术A for循环读取<Serial>下所有

App.config C# 中的自定义配置部分

【中文标题】App.config C# 中的自定义配置部分【英文标题】:Custom Config section in App.config C# 【发布时间】:2012-10-04 08:32:56 【问题描述】:

我是 C# 中配置部分的初学者 我想在配置文件中创建一个自定义部分。我在谷歌搜索后尝试如下 配置文件:

    <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="MyCustomSections">
      <section name="CustomSection" type="CustomSectionTest.CustomSection,CustomSection"/>
    </sectionGroup>
  </configSections>

  <MyCustomSections>
    <CustomSection key="Default"/>
  </MyCustomSections>
</configuration>

CustomSection.cs

    namespace CustomSectionTest

    public class CustomSection : ConfigurationSection
    
        [ConfigurationProperty("key", DefaultValue="Default", IsRequired = true)]
        [StringValidator(InvalidCharacters = "~!@#$%^&*()[]/;'\"|\\", MinLength = 1, MaxLength = 60)]
        public String Key
        
            get  return this["key"].ToString(); 
            set  this["key"] = value; 
        
    

当我使用此代码检索部分时,我收到一条错误消息,提示配置错误。

var cf = (CustomSection)System.Configuration.ConfigurationManager.GetSection("CustomSection");

我错过了什么? 谢谢。编辑 我最终需要的是

    <CustomConfigSettings>
    <Setting id="1">
        <add key="Name" value="N"/>
        <add key="Type" value="D"/>
    </Setting>
    <Setting id="2">
        <add key="Name" value="O"/>
        <add key="Type" value="E"/>
    </Setting>
    <Setting id="3">
        <add key="Name" value="P"/>
        <add key="Type" value="F"/>
    </Setting>
</CustomConfigSettings>

【问题讨论】:

请查看以下问题:***.com/questions/3935331/…***.com/questions/7983127/custom-configurationsection***.com/questions/4738/… 【参考方案1】:

App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="customAppSettingsGroup">
      <section name="customAppSettings" type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </sectionGroup>
  </configSections>
  <customAppSettingsGroup>
    <customAppSettings>
      <add key="KeyOne" value="ValueOne"/>
      <add key="KeyTwo" value="ValueTwo"/>
    </customAppSettings>
  </customAppSettingsGroup>
</configuration>

用法:

NameValueCollection settings =  
   ConfigurationManager.GetSection("customAppSettingsGroup/customAppSettings")
   as System.Collections.Specialized.NameValueCollection;

if (settings != null)

 foreach (string key in settings.AllKeys)
 
  Response.Write(key + ": " + settings[key] + "<br />");
 

【讨论】:

对于任何想要让它快速工作的人。 3 件事:1. 你必须在你的引用中添加对 System.Configuration 的引用,2. 使用 System.Configuration; 3. 使用 System.Collections.Specialized; 您也可以根据需要省略组(customAppSettingsGroup)。【参考方案2】:

尝试使用:

var cf = (CustomSection)System.Configuration.ConfigurationManager.GetSection("MyCustomSections/CustomSection");

您需要节组的名称和自定义节的名称。

【讨论】:

感谢您的回复,但这对我不起作用。请查看问题的编辑部分。【参考方案3】:

突出显示配置部分按 F1, 您将看到 MSDN 网站上的实现覆盖了一个名为“Properties”的属性,该属性返回一个“ConfigurationPropertyCollection”,因为您的属性具有该类型的匹配属性,如果不将它们包装起来,您应该能够使用您的属性填充此集合和 MS 的人一样。

【讨论】:

以上是关于C# app.config 遍历读取自定义节点的主要内容,如果未能解决你的问题,请参考以下文章

C# 对 App.config的appSettings节点数据进行加密

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

C# 读取app.config配置文件 节点键值,提示 "配置系统未能初始化" 错误的解决方案

c#自定义app.config生成配置系统初始化失败异常

App.config C# 中的自定义配置部分

C#怎么获得配置文件(App.config)的节点(Winfrom)