1

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; 
} 

답변

2

는 하나의 속성 LogLevel이있는 서브 클래스를 생성하고 새로운 유형의 당신의 기본 클래스에 대한 로깅 속성을 만들 다음은 클래스가 어떻게 생겼는지입니다.

+0

나는 이런 식으로 시도했다. 새로운'LoggingSection' 클래스가'IXmlSerializable'을 구현해야합니까, 아니면 필요에 따라'XmlRoot' 등의 속성을 정의 할 수 있습니까? –

+0

이것은 효과가 있습니다. 'ReadXml'과'WriteXml'을'LoggingSection'에서 로그 레벨에 특정한 것을하도록 정의하고,'DLLConfigFile'에서'ReadXml'과'WriteXml'을'LoggingSection'의'ReadXml'을 사용하고 'WriteXml'. –

관련 문제