C# 用IXmlSerializable类表示XML配置文件

C# 用IXmlSerializable类表示XML配置文件,c#,configuration,properties,xml-serialization,ixmlserializable,C#,Configuration,Properties,Xml Serialization,Ixmlserializable,我正在用C#编写,并试图通过IXmlSerializable类来表示XML配置文件。但是,我不确定如何表示配置文件中的嵌套元素,例如logLevel: <?xml version="1.0" encoding="utf-8" ?> <configuration> <logging> <logLevel>Error</logLevel> </logging> <credentials>

我正在用C#编写,并试图通过
IXmlSerializable
类来表示XML配置文件。但是,我不确定如何表示配置文件中的嵌套元素,例如
logLevel

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <logging>
    <logLevel>Error</logLevel>
  </logging>
  <credentials>
    <user>user123</user>
    <host>localhost</host>
    <password>pass123</password>
  </credentials>
  <credentials>
    <user>user456</user>
    <host>my.other.domain.com</host>
    <password>pass456</password>
  </credentials>
</configuration>
但是,这不起作用,因为
不在XML文件的根节点内,它是
中更深的一个节点。我该怎么做呢

至于
节点,我猜我需要第二个类,比如
credentials节
,并具有如下属性:

[XmlElement(ElementName="logLevel", DataType="LogLevel")]
public LogLevel LogLevel;
[XmlElement(ElementName="credentials", DataType="CredentialsSection")]
public CredentialsSection[] AllCredentials;
编辑:好的,我尝试了Robert Love的建议,创建了一个
日志部分
类。但是,我的测试失败:

var xs = new XmlSerializer(typeof(DLLConfigFile));

using (var stream = new FileStream(_configPath, FileMode.Open,
    FileAccess.Read, FileShare.Read))
{
    using (var streamReader = new StreamReader(stream))
    {
        XmlReader reader = new XmlTextReader(streamReader);
        var file = (DLLConfigFile)xs.Deserialize(reader);
        Assert.IsNotNull(file);
        LoggingSection logging = file.Logging;
        Assert.IsNotNull(logging); // fails here
        LogLevel logLevel = logging.LogLevel;
        Assert.IsNotNull(logLevel);
        Assert.AreEqual(EXPECTED_LOG_LEVEL, logLevel);
    }
}
我正在测试的配置文件肯定有
。下面是这些类的外观:

[Serializable]
[XmlRoot("logging")]
public class LoggingSection : IXmlSerializable
{
    public XmlSchema GetSchema()
    {
        return null;
    }

    [XmlElement(ElementName="logLevel", DataType="LogLevel")]
    public LogLevel LogLevel;

    public void ReadXml(XmlReader reader)
    {
        LogLevel = (LogLevel)Enum.Parse(typeof(LogLevel),
            reader.ReadString());
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteString(Enum.GetName(typeof(LogLevel), LogLevel));
    }
}

[Serializable]
[XmlRoot("configuration")]
public class DLLConfigFile : IXmlSerializable
{
    [XmlElement(ElementName="logging", DataType="LoggingSection")]
    public LoggingSection Logging;
}

创建一个具有单个属性的子类
LogLevel
,然后在新类型的基类上创建一个日志属性。

我尝试了类似的方法。新的
LoggingSection
类应该实现
IXmlSerializable
,还是可以根据需要定义
XmlRoot
等属性?这很有效。我必须定义
ReadXml
WriteXml
来为
LoggingSection
中的日志级别做一些特定的事情,然后在
DLLConfigFile
中创建
ReadXml
WriteXml
使用
LoggingSection