2009-12-10 17 views
5

ho dato XML che non posso cambiare e ho bisogno di deserializzare ad una classe personalizzata:Come deserializzare XML con più elementi nidificati?

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

Poi ho deserializzare:

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

Deserializer funziona bene nel caso in cui siano deserializzate elementi semplici . Quando c'è elemento come indirizzi implemento IXmlSerializable la classe dei come qui: link text

Il problema è che reader.ReadElementContentAsString() non può essere utilizzata con elementi complessi.

risposta

3

classe Adressess dovrebbe essere dichiarato in questo modo:

[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

noti che il tipo nome non è rilevante, così ad esempio la proprietà MainAddress potrebbe essere implementata in una classe MainAddressStore o qualsiasi altra cosa (a mio avviso è talvolta confuso avere proprietà e tipi di nomi di condivisione). Questo non è molto importante per le classi skeleton come questa il cui unico scopo è il supporto per la serializzazione, ovviamente. –

+0

Ho appena modificato i nomi delle proprietà per essere diversi dai nomi delle classi. Non sono sicuro se le distinte classi MainAddress e AdditionalAddress siano realmente necessarie. Volevo che fossero annonati con un nome XmlRoot diverso. – PanJanek

+0

Non funziona. MainAddress è popolato ma AdditionalAddresses no. – jlp

0

Anche se il tipo di oggetto radice ha uno spazio dei nomi, è necessario utilizzare lo stesso spazio dei nomi per i tipi nidificati.

Esempio:

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

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