.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