2009-09-04 69 views
2

我想從XML中將具有相同名稱的多個元素加載到使用C#中的反序列化的類中。我的示例中的所有內容都可以正常加載,但數組元素(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

僅供參考,'file'永遠不會爲空。 – 2009-09-04 15:18:37

回答

4

嘗試把[XmlElement]Element3

+0

這工作!謝謝! – Ryall 2009-09-04 15:30:52

+0

@John:哇太簡單了:)。我不知道這個屬性是可能的。 – 2009-09-05 01:37:03

+0

閱讀關於屬性的文檔是非常值得的,甚至爲自己創建一些小例子來看看它們是如何工作的。遲早你會需要他們。 – 2009-09-05 01:43:48

2

你的數組沒有加載的原因是因爲,只要.NET XML序列化的問題,你不是想讀一個數組。數組將表示是這樣的:

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

您需要更改源XML的格式或創建自定義XML序列化的類來處理你的情況。

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 2009-09-04 14:41:59

+0

@Kelix:好的,如果你無法收到一個正確格式的xml,你需要按照Justin的建議創建一個自定義的Xml序列化器。 – 2009-09-04 14:47:21