Lavorare con l'XML, Visual Studio e C#

Programmazione in Microsoft Visual StudioMicrosoft Visual Studio: lavorare con l'XML e C#

Vediamo qualche esempio su come si lavora con documenti XML. Gli esempi sono in linguaggio C# e Visual Studio.

 

AGGIORNAMENTI

18/01/2016: tips sulla sicurezza

22/08/2014: aggiornamento

 

 

 


Quale classe importare?


using System.Xml;



Creo un Xml Document:


XmlDocument xmlDoc = new XmlDocument();

Per motivi di sicurezza si annulla l'XmlResolver (la risoluzione di schemi e tipi è quindi negata!!!):

 

xmlDoc.XmlResolver = null;

 


Carico l'xml document a partire da una stringa che contiene dell'xml:


String testoxml = "...";
xmlDoc.LoadXml(testoxml);



Dentro xmlDoc ho il mio documento xml con dentro la struttura xml trovata dentro la variabile testoxml.

Prendo il primo figlio:


String primoFiglio = xmlDoc.DocumentElement.FirstChild.OuterXml;



Creo un elemento nel mio documento con un attributo:


XmlElement mioElemento = xmlDoc.CreateElement("TestElemento");
mioElemento.SetAttribute("MioAttributo", "ValoreAttributo");



Se voglio aggiungere questo elemento ad un altro:


altroElemento.AppendChild(mioElemento);



Se voglio tutto il mio xml come stringa:


altroElemento.OuterXml;



Se voglio un dato attributo del mio documento xml:


xmlDoc.DocumentElement.GetAttribute("MioAttributo");



O per settarlo:


xmlDoc.DocumentElement.SetAttribute("MioAttributo", "MioValore");



Se voglio selezionare un nodo dal mio documento xml:


XmlNode mioNodo = xmlDoc.SelectSingleNode(@"/ElementoUno/ElementoDue");

 

Oppure si può:

 

XmlNode selectedNode = xmlDoc.GetElementsByTagName("ElementoUno");



Leggere il valore di un attributo del mio nodo:


mioNodo.Attributes["MioAttributo"].Value;



Aggiungere un attributo al nodo:


XmlAttribute MioAttributo = xresp.CreateAttribute("MioAttributo");
MioAttributo.Value = "test valore";
mioNodo.Attributes.Append(MioAttributo);

 

Vediamo come, in automatico, trasformare la mia classe in XML:

 

public string ToXml()
{
    string result = null;
    XmlWriterSettings mywriterSettings = new XmlWriterSettings();
    //non si vuole l'intestazione xml
    mywriterSettings.OmitXmlDeclaration = true;

    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    //si aggiunge un elemento vuoto
    ns.Add("", "");
    StringWriter strWriter = new StringWriter();
    XmlSerializer xs = new XmlSerializer(this.GetType());
    StringWriter sw = new StringWriter();
    using (XmlWriter writer = XmlWriter.Create(sw, mywriterSettings))
    {
        xs.Serialize(writer, this, ns);
        result = sw.ToString();
    }
    return result;
}

 

Vediamo ora il processo inverso, come da un XML posso istanziare la mia classe:

 

public MiaClasse FromXml(string xml)
{
    MiaClasse result = null;
    XmlSerializer xs = new XmlSerializer(typeof(MiaClasse));
    using (StringReader sr = new StringReader(xml))
    {
        result = (MiaClasse)xs.Deserialize(sr);
    }
    return result;
}

 

 

 

Buon lavoro!