我正在用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>
有一个名为LogLevel
的枚举,代表logLevel
标记的所有可能值。 credentials
中的标签应全部以字符串形式出现。在我的班级,名为DLLConfigFile
,我有以下内容:
[XmlElement(ElementName="logLevel", DataType="LogLevel")]
public LogLevel LogLevel;
但是,这不起作用,因为<logLevel>
不在XML文件的根节点内,它是<logging>
中更深的一个节点。我该怎么做呢?
至于<credentials>
节点,我猜我需要第二节课,比如说CredentialsSection
,并且有一个如下属性:
[XmlElement(ElementName="credentials", DataType="CredentialsSection")]
public CredentialsSection[] AllCredentials;
编辑:好吧,我尝试了Robert Love的建议,并创建了一个LoggingSection
课程。但是,我的测试失败了:
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);
}
}
我正在测试的配置文件肯定有<logging>
。这是类的样子:
[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;
}
答案 0 :(得分:2)
创建一个具有单个属性LogLevel
的子类,然后在基类上创建一个属于新类型的日志记录属性。