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".