2013-08-31 1 views
1

xml 기반의 구성 파일 (app.config 아님)을로드 할 프로그램을 만들고 있습니다.xml (de) serialization과 함께 일반 xml 데이터가 필요합니까?

이 구성 파일에서 프로그램에서 인스턴스화해야하는 유형을 지정하고 구성합니다.

는 여기에 내가이 구상하는 방법의 예 : 안쪽 요소가 문제 <type-configuration>입니다

<?xml version="1.0"?> 
<configuration> 
    <types> 
     <type assembly="SomeAssembly.dll" class="SomeAssembly.SomeClass"> 
      <type-configuration> 
       <address>192.168.0.1</address> 
       <port>80</port> 
      </type-configuration> 
     </type> 
    </types> 
</configuration> 

있다. 내부의 요소는 SomeAssembly.SomeClass이 필요로하는 특정 구성에 따라 달라지며 프로그램에 "알려진"것이 아닙니다. 새로운 유형을 추가함으로써

, 그 부분은 다음과 같습니다

<type assembly="SomeAssembly.dll" class="SomeAssembly.SomeClass"> 
    <type-configuration> 
     <address>192.168.0.1</address> 
     <port>80</port> 
    </type-configuration> 
</type> 
<type assembly="SomeOtherAssembly.dll" class="SomeOtherAssembly.SomeOtherClass"> 
    <type-configuration> 
     <url>http://www.domain.com/path/to/webpage</url> 
     <authentication-token>1234567890ABC</authentication-token> 
    </type-configuration> 
</type> 

내가 강력한 형식의 객체로 위의 XML 파일을 역 직렬화, 여전히 나와 함께 그 하위 XML 부분을 수행 할 수있는 방법이 있나요 그래서 유형 자체가이를 자체 오브젝트로 비 직렬화 할 수 있습니까?

즉. 내가 그 SubType.Configuration 속성을 선언하려면 어떻게

[XmlType("configuration")] 
public class Configuration 
{ 
    [XmlElement("types")] 
    public Collection<SubType> Types 
    { 
     ... 
    } 
} 

[XmlType("type")] 
public class SubType 
{ 
    [XmlElement("configuration")] 
    public ??? Configuration { get; set; } 
} 

: 내 프로그램의 구성 클래스는 다음과 같이 될 수 있을까? 그게 가능한가?

결국 속성에있는 데이터는 구성 파일에 지정된 유형의 인스턴스화 된 개체에 제공됩니다. 난 아직 그 부분을 작성하지 않은, 그래서 무엇이든 내가 원하는 것을 보여주는, 내가 들어 왔 얼마나 멀리 여기

완전한 LINQPad 프로그램입니다, 정말 괜찮을 것 일 것입니다 :

void Main() 
{ 
    const string xml = @"<?xml version=""1.0""?> 
<configuration> 
    <types> 
     <type assembly=""SomeAssembly.dll"" class=""SomeAssembly.SomeClass""> 
      <type-configuration> 
      <address>192.168.0.1</address> 
      <port>80</port> 
      </type-configuration> 
     </type> 
     <type assembly=""SomeOtherAssembly.dll"" class=""SomeOtherAssembly.SomeOtherClass""> 
      <type-configuration> 
      <url>http://www.domain.com/path/to/webpage</url> 
      <authentication-token>1234567890ABC</authentication-token> 
      </type-configuration> 
     </type> 
    </types> 
</configuration>"; 

    var serializer = new XmlSerializer(typeof(Configuration)); 
    using (var reader = new StringReader(xml)) 
    { 
     var configuration = (Configuration)serializer.Deserialize(reader); 
     configuration.Dump(); 
    } 
} 

[XmlType("configuration")] 
public class Configuration 
{ 
    private readonly Collection<SubType> _Types = new Collection<SubType>(); 

    [XmlArray("types")] 
    public Collection<SubType> Types 
    { 
     get 
     { 
      return _Types; 
     } 
    } 
} 

[XmlType("type")] 
public class SubType 
{ 
    private readonly Collection<XmlNode> _Configuration = new Collection<XmlNode>(); 

    [XmlAttribute("assembly")] 
    public string AssemblyName { get; set; } 

    [XmlAttribute("class")] 
    public string ClassName { get; set; } 

    [XmlElement("type-configuration")] 
    public Collection<XmlNode> Configuration 
    { 
     get 
     { 
      return _Configuration; 
     } 
    } 
} 

이 의지 두 SubType 개체를 덤프하지만 Configuration 속성에는 <type-configuration>...</type-configuration> 부분의 첫 번째 하위 요소 만 포함됩니다. 속성 유형을 string으로 변경하면 가장 안쪽에있는 텍스트 만 제공됩니다. IP 주소 나 URL을 XmlDocument으로 변경하면 XmlNode과 동일하게 나타납니다.

+0

위의 질문에서 틀린 꼬리표 및/또는 제목 및/또는 용어를 사용하여 올바른 것을 편집하십시오. –

답변

0

어떻게 XML을 구문 분석 Linq2Xml를 사용하는 대신 XmlSerializer가와 역 직렬화하려고에 대한

var types = XDocument.Parse(xml) 
       .Descendants("type") 
       .Select(t => new SubType 
       { 
        AssemblyName = t.Attribute("assembly").Value, 
        ClassName = t.Attribute("class").Value, 
        Configuration = t.Element("type-configuration") 
            .Elements() 
            .ToDictionary(c=>c.Name.LocalName,c=>c.Value) 
       }) 
       .ToList(); 
내가 구글에 쿵하는 소리 오른쪽 키워드를 가지고 올 수없는 나는, 그래서 나는 경우
public class SubType 
{ 
    public string AssemblyName { get; set; } 
    public string ClassName { get; set; } 
    public Dictionary<string, string> Configuration { set; get; } 
} 
+0

이 파일에서 (잠재적으로) 직렬화 될 약 45 가지 유형이 있습니다. 각 유형의 모든 특성을 처리하는 사용자 정의 코드를 작성하고 싶지는 않습니다. –

+0

@ LasseV.Karlsen 이해가 안됩니다. 코드에서 * url * 또는 * port *와 같은 * 구성 *에 따라 아무 것도 사용하지 않았습니다. 유형의 공통 속성 만 – I4V

관련 문제