2009-09-04 3 views
2

C에서 deserialisation을 사용하여 XML에서 같은 이름의 요소를 여러 개로드하려고합니다. 내 예제의 모든 것이 잘로드되지만 배열 요소 (Element3)는 채워지지 않습니다.C#에서 직렬화를 사용하여 여러 XML 요소로드하기

코드 :

class Program 
{ 
    static void Main(string[] args) 
    { 
     FileStream file = new FileStream("service.xml", FileMode.Open); 

     if (file != null) 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(Service)); 
      Service service = (Service)serializer.Deserialize(file); 
     } 
    } 
} 

public class Service 
{ 
    public bool Element1; 
    public string Element2; 
    public string[] Element3; 
} 

XML :

<Service> 
    <Element1>true</Element1> 
    <Element2>Text 1</Element2> 
    <Element3>Text 2</Element3> 
    <Element3>Text 3</Element3> 
</Service> 
+0

FYI,'file'은 결코 null이 될 수 없습니다. –

답변

4

Element3[XmlElement]을 넣어보십시오.

+0

이것은 효과가있다! 감사! – Ryall

+0

@ 존 : 와우 ​​너무 간단 :). 나는이 속성으로 가능하다는 것을 몰랐다. –

+0

특성에 대한 문서를 읽고 심지어 작동하는 방법을보기 위해 약간의 예제를 작성하는 것이 좋습니다. 머지 않아 당신은 그들을 필요로 할 것입니다. –

2

까지 .NET XML 직렬화에 관한 한, 당신이 시도하지 않는, 때문에 배열이로드되지 않는 이유는 배열을 읽는다. 당신은 원본 XML의 형식을 변경하거나 클래스 상황에 대처하기위한 사용자 정의 XML 시리얼을 만드는 중 하나를해야합니다

<Element3Array> 
    <ArrayElement>Text 2</ArrayElement> 
    <ArrayElement>Text 3</ArrayElement> 
</Element3Array> 

: 배열은 같은 것을 표현 될 것입니다.

2

XML이 잘못되었다고 생각합니다.

<Element3> 
    <string>Text 2</string> 
    <string>Text 3</string> 
</Element3> 

그래서, 당신의 XML이 형식이 있어야합니다 :

<Service> 
    <Element1>true</Element1> 
    <Element2>Text 1</Element2> 
    <Element3> 
     <string>Text 2</string> 
     <string>Text 3</string> 
    </Element3> 
</Service> 

편집을 : 논리적으로, 배열은 다음과 같이 직렬화됩니다 당신이 형식을 변경할 수없는 경우이 XML 문자열을 비 일렬 화하기 위해 예를 추가했습니다. 아래 코드는 테스트되지 않았습니다.

클래스 서비스는 IXmlSerializable에서 파생해야합니다

public class Service : IXmlSerializable 
{ 
    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     List<string> element3 = new List<string>(); 

     while (reader.Read()) 
     { 
     if (reader.Name == "Element1" && reader.NodeType == XmlNodeType.Element) 
     { 
      Element1 = Convert.ToBoolean(reader.ReadString()); 
     } 
     else if (reader.Name == "Element2" && reader.NodeType == XmlNodeType.Element) 
     { 
      Element2 = reader.ReadString(); 
     } 
     if (reader.Name == "Element1" && reader.NodeType == XmlNodeType.Element) 
     { 
      element3.Add(reader.ReadString()); 
     } 
     } 

     Element3 = element3.ToArray(); 
    } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteStartElement ("Service"); 

     writer.WriteStartElement ("Element1"); 
     writer.WriteString(Element1.ToString()); 
     writer.WriteEndElement(); 

     writer.WriteStartElement ("Element2"); 
     writer.WriteString(Element2.ToString()); 
     writer.WriteEndElement(); 

     foreach (string ele in Element3) 
     { 
     writer.WriteStartElement ("Element3"); 
     writer.WriteString(ele); 
     writer.WriteEndElement(); 
     } 

     writer.WriteEndElement(); 
    } 
} 
+0

그건 내 XML이 아니에요. 내가 처리해야 할 것입니다. – Ryall

+0

@Kelix : 클래스에 맞게 올바르게 포맷 된 XML을받을 수 없다면 저스틴이 제안한대로 사용자 지정 Xml serializer를 만들어야합니다. –

관련 문제