• .Net 读取配置文件 xml


    直接解析XML文件

    1、System.Xml.Linq命名空间下提供可以使用linq查询的类,使用linq to xml读取也很方便。
    2、还可以使用System.Xml.Serialization类的DeSerialize方法直接实例化。
    https://docs.microsoft.com/zh-cn/dotnet/api/system.xml.serialization.xmlserializer.deserialize?view=netcore-2.2

    在直接读取文件的时候由于手动getAttribute很麻烦,而且容易出错,attribute可以参考log4net的方式,全部做成宏定义:

    使用.Net提供的的方式(ConfigurationManager类,支持.Net Core 2)

    特别说明:
    using System.Configuration 之后可能还要手动勾选,如下图:

    使用.Net提供的方法读取有时候会很方便,可以直接将配置信息填写在app.config文件中例如下面的配置文件

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
     
      <startup> 
          <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
      </startup>
    
      <appSettings>    
        <add key="name" value="kun"/>
        <add key="name2" value="kun"/>
      </appSettings>
    
      <connectionStrings>
        <add name="WingtipToys" connectionString="Data Source=(LocalDB)v11.0;Initial Catalog=WingtipToys;Integrated Security=True;Pooling=False" />    
      </connectionStrings>
    
    </configuration>
    

    读取的时候:

    static void ReadAllSettings()
            {
                try
                {
                    var appSettings = ConfigurationManager.AppSettings;
    
                    if (appSettings.Count == 0)
                    {
                        Console.WriteLine("AppSettings is empty.");
                    }
                    else
                    {
                        foreach (var key in appSettings.AllKeys.Where((key) =>  key == "name"))
                        {
                            Console.WriteLine("Key: {0} Value: {1}", key, appSettings[key]);
                        }
                    }
                }
                catch (ConfigurationErrorsException)
                {
                    Console.WriteLine("Error reading app settings");
                }
            }
    
            static void ReadSetting(string key)
            {
                try
                {
                    var appSettings = ConfigurationManager.AppSettings;
                    string result = appSettings[key] ?? "Not Found";
                    Console.WriteLine(result);
                }
                catch (ConfigurationErrorsException)
                {
                    Console.WriteLine("Error reading app settings");
                }
            }
    

    读取数据库连接信息也可以只用一句代码:

    var connectionString = ConfigurationManager.ConnectionStrings["WingtipToys"].ConnectionString;
    

    对于这种简单key/Value方式的配置,使用ConfigurationManager类还是很方便的。

    自定义配置

    配置比较复杂呢?当然App.config文件也支持自定义,就是用起来比较复杂,需要手动写一个有各种限制的类。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    
      <configSections>
        <section name="sampleSection" type="System.Configuration.SingleTagSectionHandler" />
      </configSections>
      
      <startup> 
          <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
      </startup>
    
      <appSettings>    
        <add key="name" value="kun"/>
        <add key="name2" value="kun"/>
      </appSettings>
    
      <connectionStrings>
        <add name="WingtipToys" connectionString="Data Source=(LocalDB)v11.0;Initial Catalog=WingtipToys;Integrated Security=True;Pooling=False" />    
      </connectionStrings>
    
    
      <sampleSection setting1="Value1"
                     setting2="value two"
                     setting3="third value">
      </sampleSection>
    
    </configuration>
    

    上面sampleSection 就是自定义的配置,使用起来的话需要手动实现下面这个类(微软官方的示例):

    // Define a custom section.
    // The CustomSection type allows to define a custom section 
    // programmatically.
    public sealed class CustomSection : 
        ConfigurationSection
    {
        // The collection (property bag) that contains 
        // the section properties.
        private static ConfigurationPropertyCollection _Properties;
        
        // Internal flag to disable 
        // property setting.
        private static bool _ReadOnly;
    
        // The FileName property.
        private static readonly ConfigurationProperty _FileName =
            new ConfigurationProperty("fileName", 
            typeof(string),"default.txt", 
            ConfigurationPropertyOptions.IsRequired);
    
        // The MaxUsers property.
        private static readonly ConfigurationProperty _MaxUsers =
            new ConfigurationProperty("maxUsers", 
            typeof(long), (long)1000, 
            ConfigurationPropertyOptions.None);
        
        // The MaxIdleTime property.
        private static readonly ConfigurationProperty _MaxIdleTime =
            new ConfigurationProperty("maxIdleTime", 
            typeof(TimeSpan), TimeSpan.FromMinutes(5), 
            ConfigurationPropertyOptions.IsRequired);
    
        // CustomSection constructor.
        public CustomSection()
        {
            // Property initialization
            _Properties = 
                new ConfigurationPropertyCollection();
    
            _Properties.Add(_FileName);
            _Properties.Add(_MaxUsers);
            _Properties.Add(_MaxIdleTime);
       }
    
      
        // This is a key customization. 
        // It returns the initialized property bag.
        protected override ConfigurationPropertyCollection Properties
        {
            get
            {
                return _Properties;
            }
        }
    
    
        private new bool IsReadOnly
        {
            get
            {
                return _ReadOnly;
            }
        }
    
        // Use this to disable property setting.
        private void ThrowIfReadOnly(string propertyName)
        {
            if (IsReadOnly)
                throw new ConfigurationErrorsException(
                    "The property " + propertyName + " is read only.");
        }
    
    
        // Customizes the use of CustomSection
        // by setting _ReadOnly to false.
        // Remember you must use it along with ThrowIfReadOnly.
        protected override object GetRuntimeObject()
        {
            // To enable property setting just assign true to
            // the following flag.
            _ReadOnly = true;
            return base.GetRuntimeObject();
        }
    
    
        [StringValidator(InvalidCharacters = " ~!@#$%^&*()[]{}/;'"|\",
            MinLength = 1, MaxLength = 60)]
        public string FileName
        {
            get
            {
                return (string)this["fileName"];
            }
            set
            {
                // With this you disable the setting.
                // Remember that the _ReadOnly flag must
                // be set to true in the GetRuntimeObject.
                ThrowIfReadOnly("FileName");
                this["fileName"] = value;
            }
        }
    
        [LongValidator(MinValue = 1, MaxValue = 1000000,
            ExcludeRange = false)]
        public long MaxUsers
        {
            get
            {
                return (long)this["maxUsers"];
            }
            set
            {
                this["maxUsers"] = value;
            }
        }
    
        [TimeSpanValidator(MinValueString = "0:0:30",
            MaxValueString = "5:00:0",
            ExcludeRange = false)]
        public TimeSpan MaxIdleTime
        {
            get
            {
                return  (TimeSpan)this["maxIdleTime"];
            }
            set
            {
                this["maxIdleTime"] = value;
            }
        }
       
        
    }
    

    参考:
    https://docs.microsoft.com/zh-cn/dotnet/api/system.configuration.configurationmanager?view=netframework-4.7.2
    https://docs.microsoft.com/zh-cn/dotnet/api/system.configuration.configurationsection?view=netframework-4.7.2
    https://blog.csdn.net/aojiancc2/article/details/21618299

  • 相关阅读:
    利用border制作三角形原理
    JavaScript中null和undefined
    localStorage 如何存储JSON数据并读取JSON数据
    常见的几种浏览器内核简单介绍
    关于Banner设计的促销氛围
    分数分配
    餐饮管理系统
    餐馆管理之点菜
    餐饮管理之结账
    餐饮管理之菜品管理
  • 原文地址:https://www.cnblogs.com/feipeng8848/p/10323516.html
Copyright © 2020-2023  润新知