Microsoft 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!