C#으로 작성 중이며 IXmlSerializable
클래스를 통해 XML 구성 파일을 나타냅니다. 나는 그런 logLevel
로하지만, 내 설정 파일에 중첩 된 요소를 나타내는하는 방법을 확실 해요 :은 IXmlSerializable 클래스가있는 XML 구성 파일을 나타냅니다.
<?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>
에 하나 개의 노드 깊이입니다. 어떻게해야합니까?
[XmlElement(ElementName="credentials", DataType="CredentialsSection")]
public CredentialsSection[] AllCredentials;
편집 : 좋아, 내가 노력 로버트 사랑의 제안 <credentials>
노드로
은, 내 생각 엔 내가 다음과 같은 CredentialsSection
말, 두 번째 클래스가 필요하고, 등록을해야합니다입니다 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;
}
나는 이런 식으로 시도했다. 새로운'LoggingSection' 클래스가'IXmlSerializable'을 구현해야합니까, 아니면 필요에 따라'XmlRoot' 등의 속성을 정의 할 수 있습니까? –
이것은 효과가 있습니다. 'ReadXml'과'WriteXml'을'LoggingSection'에서 로그 레벨에 특정한 것을하도록 정의하고,'DLLConfigFile'에서'ReadXml'과'WriteXml'을'LoggingSection'의'ReadXml'을 사용하고 'WriteXml'. –