2009-12-10 68 views
5

我给XML,我无法改变,我需要将其反序列化的自定义类:如何使用多个嵌套项目反序列化XML?

<Person> 
    <Addresses> 
     <MainAddress> 
      <Country /> 
      <City /> 
     </MainAddress> 
     <AdditionalAddress> 
      <Country /> 
      <City /> 
     </AdditionalAddress> 
     <AdditionalAddress> 
      <Country /> 
      <City /> 
     </AdditionalAddress> 
     ... other additional addresses 
    </Addresses> 
    ... other elements 
</Person> 

然后我反序列化:

XmlSerializer serializer = new XmlSerializer(typeof(Person), namespace); 
Person person = serializer.Deserialize(stream) as Person;  

解串器工作正常的情况下,简单的元素被反序列化。 当有元素像地址我实现它的类IXmlSerializable像这里:link text

问题是reader.ReadElementContentAsString()不能用于复杂的元素。

回答

3

Adressess类应该这样声明:

[XmlRoot("Adressess")] 
public class Adressess 
{ 
    [XmlElement(ElementName = "MainAddress")] 
    public MainAddress Main { get; set; } 

    [XmlElement(ElementName = "AdditionalAddress")] 
    public List<AdditionalAddress> AdditionalAddresses { get; set; } 
} 

[XmlRoot("MainAddress")] 
public class MainAddress 
{ 
    public string Country { get; set; } 
    public string City { get; set; } 
} 

[XmlRoot("AdditionalAddress")] 
public class AdditionalAddress 
{ 
    public string Country { get; set; } 
    public string City { get; set; } 
} 
+0

。注意,类型名称是不相关的,所以例如MainAddress属性可以在类MainAddressStore中实现,或者其他任何东西(我发现有时候会混淆有属性和类型共享名称)。这对于像这样的骨架类来说并不是非常重要,当然这只是序列化支持的唯一目的。 – 2009-12-10 13:40:55

+0

我刚编辑过的属性名称与类名称不同。我只是不确定是否真的需要不同的MainAddress和AdditionalAddress类。我希望它们以不同的XmlRoot名称进行annonated。 – PanJanek 2009-12-10 13:49:56

+0

我不工作。 MainAddress被填充,但AdditionalAddresses不是。 – jlp 2009-12-10 13:51:33

0

此外,如果根对象类型有一个命名空间,您必须使用相同的命名空间,嵌套类型。

实施例:

[System.Xml.Serialization.XmlRootAttribute(Namespace = "some namespace")] 
class Person {...} 

[System.Xml.Serialization.XmlRootAttribute(Namespace = "some namespace")] 
class MainAddress{...}