2009-09-04 32 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