C# 读取自定义XML

最简单的自定义配置

1 <?xml version="1.0" encoding="utf-8" ?>
2 <configuration>
3   <configSections>
4     <section name="simple" type="ConfigExample.Configuration.SimpleSection,ConfigExample"/>
5   </configSections>
6   <simple maxValue="20" minValue="1"></simple>
7 </configuration>

在配置文件中使用自定义配置,需要在configSections中添加一个section元素,并制定此section元素对应的类型和名字。然后再在configuration根节点下面添加此自定义配置,如上例中的simple节点。simple节点只有两个整形数的属性maxValue和minValue。

要在程序中使用自定义配置我们还需要实现存取这个配置块的类型,一般需要做如下三件事:
1. 定义类型从System.Configuration.ConfigurationSection继承
2. 定义配置类的属性,这些属性需要用ConfigurationProperty特性修饰,并制定属性在配置节中的名称和其他一些限制信息
3. 通过基类的string索引器实现属性的get ,set

非常简单和自然,如下是上面配置类的实现:

public class SimpleSection:System.Configuration.ConfigurationSection
{
    [ConfigurationProperty("maxValue",IsRequired=false,DefaultValue=Int32.MaxValue)]
    public int MaxValue
    {
        get
        {
            return  (int)base["maxValue"];
        }
        set
        {
            base["maxValue"] = value;
        }
    }
 
    [ConfigurationProperty("minValue",IsRequired=false,DefaultValue=1)]
    public int MinValue
    {
        get {
          return (int) base["minValue"];
}
set { base["minValue"] = value;
} } [ConfigurationProperty(
"enabled",IsRequired=false,DefaultValue=true)] public bool Enable { get { return (bool)base["enabled"]; } set { base["enabled"]= value; } } }

具体的引用

SimpleSection simple = ConfigurationManager.GetSection("simple") as SimpleSection;
Console.WriteLine("simple minValue={0} maxValue = {1}",simple.MinValue,simple.MaxValue);

稍微复杂一点的XML

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="complex" type="ConfigExample.Configuration.ComplexSection,ConfigExample"/>
  </configSections>
  <complex height="190">
    <child firstName="James" lastName="Bond"/>
  </complex>
</configuration>

这个配置的名字是complex,他有一个属性height,他的节点内还有一个child元素这个元素有两个属性firstName和lastName;对于这个内嵌的节点该如何实现呢?首先我们需要定义一个类,要从ConfigurationElement类继承,然后再用和SimpleSection类似的方法定义一些用ConfigurationProperty特性修饰的属性就可以了,当然属性值的get,set也要使用基类的索引器。如下实现:

public class ComplexSection: ConfigurationSection
{
    [ConfigurationProperty("height",IsRequired = true)]
    public int Height
    {
        get
        {
            return (int)base["height"];
        }
        set
        {
            base["height"]= value;
        }
    }
 
    [ConfigurationProperty("child",IsDefaultCollection = false)]
    public ChildSection Child
    {
        get
        {
            return (ChildSection)base["child"];
        }
        set
        {
            base["child"]= value;
        }
    }
}
public class ChildSection: ConfigurationElement
{
    [ConfigurationProperty("firstName",IsRequired = true,IsKey = true)]
    public string FirstName
    {
        get
        {
            return (string)base["firstName"];
        }
        set
        {
            base["firstName"]= value;
        }
    }
 
    [ConfigurationProperty("lastName",IsRequired = true)]
    public string LastName
    {
        get
        {
            return (string)base["lastName"];
        }
        set
        {
            base["lastName"]= value;
        }
    }
}

再复杂一点的情况

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="complex" type="ConfigExample.Configuration.ComplexSection,ConfigExample"/>
  </configSections>
  <complex height="190">
    <child firstName="James" lastName="Bond"/>
 
    <children>
      <add firstName="Zhao" lastName="yukai"/>
      <add firstName="Lee" lastName="yukai"/>
      <remove firstName="Zhao"/>
    </children>
  </complex>
</configuration>

请看children节点,它就是一个集合类,在它里面定义了一组add元素,也可以有remove节点把已经添进去的配置去掉。

要使用自定义节点集合需要从ConfigurationElementCollection类继承一个自定义类,然后要实现此类GetElementKey(ConfigurationElement element)和ConfigurationElement CreateNewElement()两个方法;为了方便的访问子节点可以在这个类里面定义只读的索引器。请看下面的实现

//这里使用ChildSection类型,是因为它的数据结构和<add>节点中的一致,都是包含FirstName和LastName
public
class Children: ConfigurationElementCollection { protected override object GetElementKey(ConfigurationElement element) { return ((ChildSection)element).FirstName; } protected override ConfigurationElement CreateNewElement() { return new ChildSection(); } public ChildSection this[int i] { get { return (ChildSection)base.BaseGet(i); } } public ChildSection this[string key] { get { return (ChildSection)base.BaseGet(key); } } }

当然要使用此集合类我们必须在Complex类中添加一个此集合类的属性,并要指定集合类的元素类型等属性,如下:

    [ConfigurationProperty("children",IsDefaultCollection = false)]   //哪个节点下有重复的子节点
    [ConfigurationCollection(typeof(ChildSection), CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap, RemoveItemName = "remove")] //Remove节点生效
    public Children  Children
    {
        get
        {
            return (Children)base["children"];
        }
        set
        {
            base["children"]= value;
        }
    }

我们会经常用到类似appSettings配置节的键值对的构造,这时候我们就不必再自己实现了,我们可以直接使用现有的System.Configuration.NameValueConfigurationCollection类来定义一个自定义的键值对。可以在Complex类中定义如下属性

    [ConfigurationProperty("NVs",IsDefaultCollection = false)]
    public System.Configuration.NameValueConfigurationCollection   NVs
    {
        get
        {
            return (NameValueConfigurationCollection)base["NVs"];
        }
        set
        {
            base["NVs"] = value;
        }
    }

然后在配置文件的complex节中添加键值对配置

<NVs>
    <add name="abc" value="123"/>
    <add name="abcd" value="12d3"/>
</NVs>

基本上就这样了。

学习地址    https://blog.csdn.net/qq408146580/article/details/8920675

原文地址:https://www.cnblogs.com/cwmizlp/p/9448642.html