2009-12-10 69 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{...}