La prossima settimana dovrei laurearmi. L'oggetto della mia tesi è stato la creazione di un interfaccia grafica (una WinForm per intenderci :) per la visualizzazione di schemi e documenti XML. Mi sono quindi studiato tutto ciò che lega .NET con l'XML e l'XML Schema.
La mia attenzione però si è focalizzata sulla parte relativa agli schemi.
Un utilizzo ottimo di questi è legato alla classe DataSet, che espone un metodo (ReadXmlSchema) che permette di crearne la struttura a partire da uno schema XML.
Ecco un esempio d'uso, la creazione della struttura di un DataSet per la rappresentazione di un elenco di clienti.

<xsd:schema id="ClientiDataSet"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
>
<xsd:element name="myData" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="Clienti" >
<xsd:complexType >
<xsd:sequence>
<xsd:element name="ID" type="xsd:integer" minOccurs="0" />
<xsd:element name="Nome" type="xsd:string" minOccurs="0" />
<xsd:element name="Cognome" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>

Questo schema definisce una tabella del tipo:

Clienti (ID, Nome, Cognome)

tabella, che andrà poi a rappresentare la struttura del nostro DataSet.
Ora basta solamente creare un nuovo oggetto di tipo DataSet e chiamare il metodo ReadXmlSchema, passandogli come parametri il path del nostro schema.

DataSet ds = new DataSet();

ds.ReadXmlSchema("Clienti.xsd");

Per visualizzare la struttura dell'oggetto appena creato, vi rimando al metodo DisplayDataSetStructure, metodo che nel nostro caso, stamperà a video questo:

DataSet structure

Table name: Clienti
Column name: ID (System.Int64)
Column name: Nome (System.String)
Column name: Cognome (System.String)

Se vogliamo invece popolare il nostro DataSet, non dobbiamo far altro che creare un nuovo oggetto di tipo DataRow e assegnare i valori scelti ai suoi vari indexers; indexers che sono definiti dal nome della colonna da popolare.

DataRow newRow = ds.Tables[0].NewRow();

newRow["ID"] = 1;
newRow["Nome"] = "Giuseppe";
newRow["Cognome"] = "Marchi";
ds.Tables[0].Rows.Add(newRow);

Questa tecnica ci permette di applicare un alto livello di tipizzazione e customizzazione agli oggetti di tipo DataSet dei nostri progetti, utili alla creazione di strutture di dati solide e completamente "user-defined".