2013-04-09 81 views
11

我想反序列化这个xml结构。使用XmlArray反序列化xml文件?

<?xml version="1.0"?> 
<DietPlan> 
    <Health> 
     <Fruit>Test</Fruit> 
     <Fruit>Test</Fruit> 
     <Veggie>Test</Veggie> 
     <Veggie>Test</Veggie> 
    </Health> 
</DietPlan> 

而且我想:

[Serializable] 
[XmlRoot(ElementName = "DietPlan")] 
public class TestSerialization 
{ 
    [XmlArray("Health")] 
    [XmlArrayItem("Fruit")] 
    public string[] Fruits { get; set; } 

    [XmlArray("Health")] 
    [XmlArrayItem("Veggie")] 
    public string[] Veggie { get; set; } 
} 

但是,这将引发异常“的XML元素已经出现在当前范围内使用XML属性来指定元素的另一个XML名称或名称空间。” 谢谢你。

回答

22

您需要一个能够反序列化XML的通用类型,并且您可以使用该名称空间定义要根据元素的名称实例化的类型,如下所示。

public class StackOverflow_15907357 
{ 
    const string XML = @"<?xml version=""1.0""?> 
         <DietPlan> 
          <Health> 
           <Fruit>Test</Fruit> 
           <Fruit>Test</Fruit> 
           <Veggie>Test</Veggie> 
           <Veggie>Test</Veggie> 
          </Health> 
         </DietPlan>"; 

    [XmlRoot(ElementName = "DietPlan")] 
    public class TestSerialization 
    { 
     [XmlArray("Health")] 
     [XmlArrayItem("Fruit", Type = typeof(Fruit))] 
     [XmlArrayItem("Veggie", Type = typeof(Veggie))] 
     public Food[] Foods { get; set; } 
    } 

    [XmlInclude(typeof(Fruit))] 
    [XmlInclude(typeof(Veggie))] 
    public class Food 
    { 
     [XmlText] 
     public string Text { get; set; } 
    } 

    public class Fruit : Food { } 
    public class Veggie : Food { } 

    public static void Test() 
    { 
     MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(XML)); 
     XmlSerializer xs = new XmlSerializer(typeof(TestSerialization)); 
     TestSerialization obj = (TestSerialization)xs.Deserialize(ms); 
     foreach (var food in obj.Foods) 
     { 
      Console.WriteLine("{0}: {1}", food.GetType().Name, food.Text); 
     } 
    } 
} 
+0

谢谢。拯救了我的一天! – 2013-04-10 07:30:06