2009-06-26 4 views
1

와 XML 트리를 읽는 것은 너희들이 나에게 어떻게 읽고에서 작성하는 예를 들어 줄 수 /과 같은 XML로 :IXmlSerializable이 많은 중첩 된 요소

<Foolist> 
    <Foo name="A"> 
    <Child name="Child 1"/> 
    <Child name="Child 2"/> 
    </Foo> 
    <Foo name = "B"/> 
    <Foo name = "C"> 
    <Child name="Child 1"> 
     <Grandchild name ="Little 1"/> 
    </Child> 
    </Foo> 
<Foolist> 
+0

(대답 덧글을) –

답변

2

이 요소 이름은 정말 수준에 따라 변경합니까? 그렇지 않다면 매우 간단한 클래스 모델 XmlSerializer을 사용할 수 있습니다. IXmlSerializable 구현은 까다 롭습니다. 오류가 발생하기 쉽습니다. 반드시 사용해야하는 경우가 아니면 피하십시오. 이름은 다르지만 단단한 경우

, 난 그냥 XSD를 통해 실행하는 것 : XmlSerializer를 들어

xsd example.xml 
xsd example.xsd /classes 

IXmlSerializable 예를하지 않고 (각 레벨에서 같은 이름을) :

using System; 
using System.Collections.Generic; 
using System.Xml.Serialization; 

[XmlRoot("Foolist")] 
public class Record 
{ 
    public Record(string name) 
     : this() 
    { 
     Name = name; 
    } 
    public Record() { Children = new List<Record>(); } 
    [XmlAttribute("name")] 
    public string Name { get; set; } 

    [XmlElement("Child")] 
    public List<Record> Children { get; set; } 
} 

static class Program 
{ 
    static void Main() 
    { 
     Record root = new Record { 
      Children = { 
       new Record("A") { 
        Children = { 
         new Record("Child 1"), 
         new Record("Child 2"), 
        } 
       }, new Record("B"), 
       new Record("C") { 
        Children = { 
         new Record("Child 1") { 
          Children = { 
           new Record("Little 1") 
          } 
         } 
        } 
       }} 
      }; 
     var ser = new XmlSerializer(typeof(Record)); 
     ser.Serialize(Console.Out, root); 
    } 
} 
+0

하지만 Record가 다른 클래스에서 상속받은 경우 어떤 멤버를 직렬화하지 않으시겠습니까? – Agzam

+0

그런 다음 자식 멤버를 [XmlIgnore]로 표시하거나; 또는 DataContractSerializer로 전환하고 레이아웃을 제어하기 위해 웨이브로 이동합니다. 또는 별도의 "DTO"집합을 가질 수 있습니다. 나는 DTO 경로가 최선의 선택이라고 기대한다. –

+0

여전히 IXmlSerializable 사용에 대해 생각하고 있습니다. 유일한 문제는 xmlreader가 '앞으로 만'이라는 것을 이해했다는 것입니다. 그리고 (단순한 XML 파일이 아니라 일부 구조가있는) 직렬화의 예제를 찾을 수 없습니다. – Agzam

관련 문제