Xml Serialization XmlElement XmlArray

Dato che era tanto che non lavoravo con la seralizzazione xml e questo e’ gia’ il secondo progetto in poco tempo che mi capita, riporto giusto due appunti.
A volte capita che vogliamo salvere lo stato dei nostri oggetti in xml e quindi come venga generato il file poco importa.
Altre volte invece si ha un file XML con uno schema ben preciso e lo si vuole mappare ad oggetti. E’ quindi fondamentale sapere usare XmlAttribute, XmlElement, XmlArray, XmlArrayItem, per attenersi allo schema del file.

Se si vuole ottenere un file cosi fatto:

– Appunto 1

<File FileName="CFRACFMODIF" Function="Mod">
  <Field FileField="USER" FileLength="10" ADField="SAMA" UseToSearch="true"/>
  <Field FileField="NAME" FileLength="21" ADField="SAMA" />
  <Field FileField="OWNER" FileLength="10" ADField="SAMA" />
  <Field FileField="CREATED" FileLength="8" ADField="SAMA" />
  <Field FileField="CF" FileLenght="16" ADField="SAMA" />
</File>

le classi che dobbiamo scrivere sono le seguenti.
Faccio notare l’ utilizzo di XmlElement per i Fields

[XmlRoot("File")]
public class SFile
{
    [XmlAttribute("FileName")]
    public string FileName { get; set; }

    [XmlAttribute("Function")]
    public string Function { get; set; }

    [XmlElement("Fields")]
    public List<SField> Fields { get; set; }
}

public class SField
{
    [XmlAttribute("FileField")]
    public string FileField { get; set; }

    [XmlAttribute("FileLength")]
    public string FileLength { get; set; }

    [XmlAttribute("ADField")]
    public string ADField { get; set; }
}

– Appunto 2

<File FileName="CFRACFMODIF" Function="Mod">
  <Fields>
    <Field FileField="USER" FileLength="10" ADField="SAMA" UseToSearch="true"/>
    <Field FileField="NAME" FileLength="21" ADField="SAMA" />
    <Field FileField="OWNER" FileLength="10" ADField="SAMA" />
    <Field FileField="CREATED" FileLength="8" ADField="SAMA" />
    <Field FileField="CF" FileLenght="16" ADField="SAMA" />
  </Fields>
</File>

In questo caso invece si usa XmlArray e XmlArrayItem

[XmlRoot("File")]
public class SFile
{
    [XmlAttribute("FileName")]
    public string FileName { get; set; }

    [XmlAttribute("Function")]
    public string Function { get; set; }

    [XmlArray("Fields")]
    [XmlArrayItem("Field")]
    public List<SField> Fields { get; set; }
}

public class SField
{
    [XmlAttribute("FileField")]
    public string FileField { get; set; }

    [XmlAttribute("FileLength")]
    public string FileLength { get; set; }

    [XmlAttribute("ADField")]
    public string ADField { get; set; }
}

– Appunto 3
Nel caso si abbia un property boolean e si vuole che il valore della prop sia presente nel file xml solo nel caso in cui sia settata a true fare cosi:

public class SField
{
    [XmlAttribute("FileField")]
    public string FileField { get; set; }

    [XmlAttribute("FileLength")]
    public string FileLength { get; set; }

    [XmlAttribute("ADField")]
    public string ADField { get; set; }

    [XmlAttribute("UseToSearch"), System.ComponentModel.DefaultValue(false)]
    public bool UseToSearch { get; set; }
}

Ricordarsi che settare il DefaultValue in questo modo non settera’ il valore della prop!
Quello bisogna farlo in fase di inizializzazione nel costruttore.

– Appunto 4
Quando si serializza di default viene inserito il namespace come intestazione del risultante xml.
Se si vuole serializzare un oggetto e il risultato dovra’ essere inserito all’ interno di un file xml gia’ presente, e’ necessario che venga inserito solo il “blocco” xml.

SFile File = new SFile();

#region Create and Fill Object
File.Fields = new List<SField>();
File.Fields.Add(new SField() { ADField="1", FileField="2", FileLength="3" });
File.Fields.Add(new SField());
File.FileName = "USER";
File.Function="Add";
#endregion

// remove the namespace
XmlSerializer serializer = new XmlSerializer(File.GetType());
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");


// Serialize to memory
MemoryStream stream = new MemoryStream();

serializer.Serialize(stream, File, ns);
stream.Flush();

stream.Position = 0;

// create XElement to add it to a XDocument o XElement already existing
XmlReader xr = XmlReader.Create(stream);
XElement elemAdded = XElement.Load(xr);
Annunci

Informazioni su Andrea Regoli

Project Manager .Net Developer WPF WP7 Asp.Net c# javascript ajax SQL sharepoint
Questa voce è stata pubblicata in .Net, c# e contrassegnata con , , , , . Contrassegna il permalink.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...