2009-09-04 7 views
2

C#のデシリアライゼーションを使用して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を受け取れない場合は、Justinが示唆するようにカスタムXmlシリアライザを作成する必要があります。 –

関連する問題