jlp
jlp

Reputation: 10358

How to deserialize XML with multiple nested items?

I have given XML that I can't change and I need to deserialize it to a custom class:

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

Then I deserialize:

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

Deserializer works fine in case simple elements are deserialized. When there is element like Addresses I implement IXmlSerializable on its class like here: link text

The problem is that reader.ReadElementContentAsString() cannot be used with complex elements.

Upvotes: 6

Views: 3970

Answers (2)

shrutyzet
shrutyzet

Reputation: 529

Also if the root object type has a namespace, you must use the same namespace for the nested types.

Example:

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

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

Upvotes: 0

PanJanek
PanJanek

Reputation: 6685

Adressess class should be declared this way:

[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; }
}

Upvotes: 4

Related Questions