Un caso semplicissimo,può diventare un incubo per diverse ore…
Un xml di questo tipo:
1 2 3 4 5 6 7 8 9 10 11 | <?xml version="1.0" encoding="utf-8"?> <Applicazioni> <Applicazione> <NomeApplicazione>XXX1</NomeApplicazione> <Stato>Attiva</Stato> </Applicazione> <Applicazione> <NomeApplicazione>XXX2</NomeApplicazione> <Stato>Attiva</Stato> </Applicazione> </Applicazioni> |
L’utilizzo di una classe per deserializzare il contenuto di questo xml in un oggetto, in c# , diventa difficile a causa della natura del Root Item di questo xml, “Applicazioni”, che risulta essere un Array di “Applicazione” .
Per poter lavorare in maniera corretta con gli attributi XmlArray e XmlArrayItem, senza stare a romperci la testa, aggiungiamo un nodo contenitore ad “Applicazioni”, come nell’esempio seguente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?xml version="1.0" encoding="utf-8"?> <ServizioStato> <Applicazioni> <Applicazione> <NomeApplicazione>XXX1</NomeApplicazione> <Stato>Attiva</Stato> </Applicazione> <Applicazione> <NomeApplicazione>XXX2</NomeApplicazione> <Stato>Attiva</Stato> </Applicazione> </Applicazioni> </ServizioStato> |
In questo modo possiamo andare a definire un oggetto per la deserializzazione cosi definito :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | using System; using System.Xml.Serialization; namespace ServizioStato { [Serializable()] [XmlRoot("ServizioStato",Namespace="",IsNullable=false)] public class ServizioStatoApplicazioni { private Applicazione[] applicazioni; [XmlArray("Applicazioni")] [XmlArrayItem("Applicazione", typeof(Applicazione))] public Applicazione[] StatoApplicazioni { get { return this.applicazioni; } set { this.applicazioni = value; } } } [Serializable] public class Applicazione { private string nomeApplicazioneField; private string statoField; [System.Xml.Serialization.XmlElementAttribute("Applicazione", Namespace="",Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public string Applicazione { get { return this.nomeApplicazioneField; } set { this.nomeApplicazioneField = value; } } [System.Xml.Serialization.XmlElementAttribute("Stato", Namespace="",Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public string Stato { get { return this.statoField; } set { this.statoField = value; } } } |
Una cosa su cui riflettere è che il tool XSD per la generazione degli oggetti, non ci viene in aiuto con delle strutture definite come il primo esempio (prima dell’aggiunta del nodo ServizioStato), non riuscendo a generare le classi in maniera corretta.