<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>diploD &#187; csharp</title>
	<atom:link href="http://www.diplod.it/tag/csharp/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.diplod.it</link>
	<description>by Davide Del Monte</description>
	<lastBuildDate>Fri, 13 Feb 2015 14:26:10 +0000</lastBuildDate>
	<language>it-IT</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>Leggere e visualizzare file XML con C# (C sharp): qualche esempio</title>
		<link>http://www.diplod.it/2010/07/13/leggere-e-visualizzare-file-xml-con-c-c-sharp-qualche-esempio/</link>
		<comments>http://www.diplod.it/2010/07/13/leggere-e-visualizzare-file-xml-con-c-c-sharp-qualche-esempio/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 12:31:32 +0000</pubDate>
		<dc:creator><![CDATA[Davide]]></dc:creator>
				<category><![CDATA[Applicazioni Web]]></category>
		<category><![CDATA[web standards]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[aspx]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xsd]]></category>

		<guid isPermaLink="false">http://www.diplod.it/?p=1127</guid>
		<description><![CDATA[C# è ormai un linguaggio diffuso, Visual Studio volenti o nolenti è un IDE collaudato e comodo anche per lo sviluppo di applicazioni web. E quando si parla di web, si parla spesso di XML. Leggere i dati di un documento XML è un'operazione semplice e veloce, farli visualizzare su una pagina web è altrettanto rapido, ma è bene sapere alcune nozioni per potersi muovere con tranquillità e sicurezza.]]></description>
				<content:encoded><![CDATA[<p><strong>C#</strong> è ormai un linguaggio diffuso, <strong>Visual Studio</strong> volenti o nolenti è un IDE collaudato e comodo anche per lo sviluppo di applicazioni web. E quando si parla di web, si parla spesso di <strong>XML</strong>.</p>
<p>Leggere i dati di un documento XML è un&#8217;operazione semplice e veloce, farli visualizzare su una pagina web è altrettanto rapido, ma è bene sapere alcune nozioni per potersi muovere con tranquillità e sicurezza.</p>
<p>Andiamo con ordine e vediamo subito un esempio di un file XML che vogliamo trattare:</p>
<p><code>&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;<br />
&lt;DataSet&gt;<br />
&lt;data&gt;<br />
&lt;period&gt;2010-06-06&lt;/period&gt;<br />
&lt;logunit id="myID"&gt;Milano&lt;/logunit&gt;<br />
&lt;entered matcode="ABC001"&gt;100&lt;/entered&gt;<br />
&lt;produced matcode="ABC002"&gt;101&lt;/produced&gt;<br />
&lt;delivered matcode="ABC002"&gt;100&lt;/delivered&gt;<br />
&lt;description&gt;Caramelline alla fragola&lt;/description&gt;<br />
&lt;updated&gt;2010-06-06T13:05:21+01:00&lt;/updated&gt;<br />
&lt;note&gt;tante belle cose..&lt;/note&gt;<br />
&lt;/data&gt;<br />
&lt;data&gt;<br />
[..]<br />
&lt;/data&gt;<br />
&lt;/DataSet&gt;</code></p>
<p>Questo file potrebbe rappresentare dei dati produttivi, riguardanti ad esempio i materiali entrati in magazzino, i materiali prodotti e il venduto.</p>
<p>Il modo più rapido e banale per leggere questo file e farlo visualizzare su una pagina ASPX è tramite il seguente codice:</p>
<p><code>DataSet ds = new DataSet();<br />
ds.ReadXml(@"C:\test.xml", XmlReadMode.Auto);<br />
DataView MyDataView = new DataView(ds.Tables[0]);<br />
MyDataGrid.DataSource = MyDataView;<br />
MyDataGrid.DataBind();</code></p>
<p>Il codice non fa altro che creare un nuovo DataSet per contenere i dati che andremo a leggere, leggere il file tramite il metodo ReadXml(), creare una DataView con la tabella creata nel dataset e assegnare quest&#8217;ultima come DataSource per la DataGrid.</p>
<p><span id="more-1127"></span></p>
<p>All&#8217;interno della pagina .aspx ci sarà quindi una DataSource così fatta:</p>
<p><code>&lt;asp:DataGrid id="MyDataGrid" runat="server" &gt;<br />
    &lt;HeaderStyle CssClass="th"&gt;<br />
    &lt;/HeaderStyle&gt;<br />
&lt;/asp:DataGrid&gt;</code></p>
<p>Tralasciamo lo stile attribuito alla testata della datagrid, ciò che è importante in questo caso è solo l&#8217;ID. </p>
<p>Così facendo però ottengo una tabella di questo tipo:</p>
<table id="MyDataGrid2" border="1" cellspacing="0" rules="all">
<tbody>
<tr>
<td>period</td>
<td>data_Id</td>
<td>description</td>
<td>updated</td>
<td>note</td>
</tr>
<tr>
<td>2010-06-06</td>
<td>0</td>
<td>Caramelline alla fragola</td>
<td>2010-06-16T13:05:21+01:00</td>
<td>tante belle cose..</td>
</tr>
</tbody>
</table>
<p>E tutti gli altri dati che fine hanno fatto? Sono stati salvati in altre tabelle del DataSet, assieme a tutti gli attributi dell&#8217;xml; queste tabelle avranno come riferimento il <em>data_Id</em> e potrò utilizzarle come meglio credo.</p>
<p>Se infatti cambiamo il primo codice, mettendo una tabella diversa, in questo modo:</p>
<p><code>DataView MyDataView = new DataView(ds.Tables[1]);</code></p>
<p>Verrà visualizzata una pagina con la seguente tabella:</p>
<table id="MyDataGrid2" border="1" cellspacing="0" rules="all">
<tbody>
<tr>
<td>id</td>
<td>logunit_Text</td>
<td>data_Id</td>
</tr>
<tr>
<td>MyID</td>
<td>Milano</td>
<td>0</td>
</tr>
</tbody>
</table>
<p>Se cambio e metto la terza tabella:</p>
<p><code>DataView MyDataView = new DataView(ds.Tables[2]);</code></p>
<p>Il risultato sarà:</p>
<table id="MyDataGrid2" border="1" cellspacing="0" rules="all">
<tbody>
<tr>
<td>matcode</td>
<td>entered_Text</td>
<td>data_Id</td>
</tr>
<tr>
<td>ABC001</td>
<td>100</td>
<td>0</td>
</tr>
</tbody>
</table>
<p>Mentre per le tabelle successive, avrò questi risultati visualizzati:</p>
<table id="MyDataGrid2" border="1" cellspacing="0" rules="all">
<tbody>
<tr>
<td>matcode</td>
<td>produced_Text</td>
<td>data_Id</td>
</tr>
<tr>
<td>ABC002</td>
<td>101</td>
<td>0</td>
</tr>
</tbody>
</table>
<table id="MyDataGrid2" border="1" cellspacing="0" rules="all">
<tbody>
<tr>
<td>matcode</td>
<td>delivered_Text</td>
<td>data_Id</td>
</tr>
<tr>
<td>ABC002</td>
<td>100</td>
<td>0</td>
</tr>
</tbody>
</table>
<p>Incrociando queste tabelle attraverso il campo <em>data_Id</em> potrei ricavare tutti i dati contenuti nell&#8217;XML, attributi e testi all&#8217;interno dei tag.<br />
Il mio obiettivo era però quello di far visualizzare questi dati senza gli attributi riportati nell&#8217;XML. Ciò che mi interessa sono solo i dati riportati all&#8217;interno dei tag. Vorrei avere un risultato di questo tipo:</p>
<table id="MyDataGrid2" border="1" cellspacing="0" rules="all">
<tbody>
<tr>
<td>period</td>
<td>description</td>
<td>updated</td>
<td>note</td>
<td>logunit</td>
<td>entered</td>
<td>produced</td>
<td>delivered</td>
</tr>
<tr>
<td>2010-06-06</td>
<td>Caramelline alla fragola</td>
<td>2010-06-16T13:05:21+01:00</td>
<td>tante belle cose..</td>
<td>Milano</td>
<td>100</td>
<td>101</td>
<td>100</td>
</tr>
</tbody>
</table>
<p>In questo caso potrebbe fare al caso nostro l&#8217; <a title="XML Schema" href="http://www.w3schools.com/schema/default.asp" target="_blank">XML Schema</a>. Si tratta di un file con estensione XSD, che descrive i dati contenuti in un file XML. Ogni file XML può avere uno schema associato che lo descrive. Esistono diversi <strong>tool</strong> che possono <strong>creare un file XSD a partire da un XML</strong>, uno di questi, che trovo molto pratico è <a title="XML 2 XSD" href="http://www.flame-ware.com/products/xml-2-xsd/default.aspx" target="_blank">quello di Flame-Ware</a> completamente on-line. </p>
<p>Il nostro file XML iniziale potrebbe essere descritto da questo XSD, supponendo che tutti i campi siano stringe.</p>
<p><code>&lt;?xml version="1.0"?&gt;<br />
&lt;!-- Generated using Flame-Ware Solutions XML-2-XSD v2.0 at <a href="http://www.flame-ware.com/Products/XML-2-XSD/">http://www.flame-ware.com/Products/XML-2-XSD/</a> --&gt;<br />
&lt;xs:schema id="DataSet" xmlns="" xmlns:xs="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"&gt;<br />
  &lt;xs:element name="DataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"&gt;<br />
    &lt;xs:complexType&gt;<br />
      &lt;xs:choice minOccurs="0" maxOccurs="unbounded"&gt;<br />
        &lt;xs:element name="data"&gt;<br />
          &lt;xs:complexType&gt;<br />
            &lt;xs:sequence&gt;<br />
              &lt;xs:element name="period" type="xs:string" minOccurs="0" /&gt;<br />
              &lt;xs:element name="description" type="xs:string" minOccurs="0" /&gt;<br />
              &lt;xs:element name="updated" type="xs:string" minOccurs="0" /&gt;<br />
              &lt;xs:element name="note" type="xs:string" minOccurs="0" /&gt;<br />
              &lt;xs:element name="logunit" nillable="true" minOccurs="0" maxOccurs="unbounded"&gt;<br />
                &lt;xs:complexType&gt;<br />
                  &lt;xs:simpleContent msdata:ColumnName="logunit_Text" msdata:Ordinal="1"&gt;<br />
                    &lt;xs:extension base="xs:string"&gt;<br />
                      &lt;xs:attribute name="id" type="xs:string" /&gt;<br />
                    &lt;/xs:extension&gt;<br />
                  &lt;/xs:simpleContent&gt;<br />
                &lt;/xs:complexType&gt;<br />
              &lt;/xs:element&gt;<br />
              &lt;xs:element name="entered" nillable="true" minOccurs="0" maxOccurs="unbounded"&gt;<br />
                &lt;xs:complexType&gt;<br />
                  &lt;xs:simpleContent msdata:ColumnName="entered_Text" msdata:Ordinal="1"&gt;<br />
                    &lt;xs:extension base="xs:string"&gt;<br />
                      &lt;xs:attribute name="matcode" type="xs:string" /&gt;<br />
                    &lt;/xs:extension&gt;<br />
                  &lt;/xs:simpleContent&gt;<br />
                &lt;/xs:complexType&gt;<br />
              &lt;/xs:element&gt;<br />
              &lt;xs:element name="produced" nillable="true" minOccurs="0" maxOccurs="unbounded"&gt;<br />
                &lt;xs:complexType&gt;<br />
                  &lt;xs:simpleContent msdata:ColumnName="produced_Text" msdata:Ordinal="1"&gt;<br />
                    &lt;xs:extension base="xs:string"&gt;<br />
                      &lt;xs:attribute name="matcode" type="xs:string" /&gt;<br />
                    &lt;/xs:extension&gt;<br />
                  &lt;/xs:simpleContent&gt;<br />
                &lt;/xs:complexType&gt;<br />
              &lt;/xs:element&gt;<br />
              &lt;xs:element name="delivered" nillable="true" minOccurs="0" maxOccurs="unbounded"&gt;<br />
                &lt;xs:complexType&gt;<br />
                  &lt;xs:simpleContent msdata:ColumnName="delivered_Text" msdata:Ordinal="1"&gt;<br />
                    &lt;xs:extension base="xs:string"&gt;<br />
                      &lt;xs:attribute name="matcode" type="xs:string" /&gt;<br />
                    &lt;/xs:extension&gt;<br />
                  &lt;/xs:simpleContent&gt;<br />
                &lt;/xs:complexType&gt;<br />
              &lt;/xs:element&gt;<br />
            &lt;/xs:sequence&gt;<br />
          &lt;/xs:complexType&gt;<br />
        &lt;/xs:element&gt;<br />
      &lt;/xs:choice&gt;<br />
    &lt;/xs:complexType&gt;<br />
  &lt;/xs:element&gt;<br />
&lt;/xs:schema&gt;</code></p>
<p>Per associare questo schema al file XML, è necessario dichiararlo nell&#8217;intestazione, in questo modo:</p>
<p><code>&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;<br />
&lt;DataSet <span style="color: #800000;">xmlns:xsi="</span><a href="http://www.w3.org/2001/XMLSchema-instance"><span style="color: #800000;">http://www.w3.org/2001/XMLSchema-instance</span></a><span style="color: #800000;">"<br />
xsi:noNamespaceSchemaLocation="schema.xsd"</span>&gt;<br />
&lt;data&gt;<br />
&lt;period&gt;2010-06-06&lt;/period&gt;<br />
&lt;logunit id="myID"&gt;Milano&lt;/logunit&gt;<br />
&lt;entered matcode="ABC001"&gt;100&lt;/entered&gt;<br />
&lt;produced matcode="ABC002"&gt;101&lt;/produced&gt;<br />
&lt;delivered matcode="ABC002"&gt;100&lt;/delivered&gt;<br />
&lt;description&gt;Caramelline alla fragola&lt;/description&gt;<br />
&lt;updated&gt;2010-06-06T13:05:21+01:00&lt;/updated&gt;<br />
&lt;note&gt;tante belle cose..&lt;/note&gt;<br />
&lt;/data&gt;<br />
&lt;/DataSet&gt;</code></p>
<p>Così facendo però, se rilanciamo la pagina costruita in precedenza, il risultato sarà identico: un unico dataset con diverse tabelle collegate tra loro dal campo <em>data_Id</em>.</p>
<p>Quindi? La soluzione c&#8217;è. <strong>Dobbiamo solo definire uno schema XSD semplificato all&#8217;interno dell&#8217;XML stesso</strong>. In questo modo:</p>
<p><code>&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;<br />
&lt;DataSet&gt;<br />
<span style="color: #800000;">&lt;xs:schema id="NewDataset" xmlns="" xmlns:xs="</span><a href="http://www.w3.org/2001/XMLSchema"><span style="color: #800000;">http://www.w3.org/2001/XMLSchema</span></a><span style="color: #800000;">" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"&gt;<br />
  &lt;xs:element name="NewDataset" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"&gt;<br />
    &lt;xs:complexType&gt;<br />
      &lt;xs:choice minOccurs="0" maxOccurs="unbounded"&gt;<br />
        &lt;xs:element name="data"&gt;<br />
          &lt;xs:complexType&gt;<br />
            &lt;xs:sequence&gt;<br />
              &lt;xs:element name="period" type="xs:string" minOccurs="0" /&gt;<br />
              &lt;xs:element name="description" type="xs:string" minOccurs="0" /&gt;<br />
              &lt;xs:element name="updated" type="xs:string" minOccurs="0" /&gt;<br />
              &lt;xs:element name="note" type="xs:string" minOccurs="0" /&gt;<br />
              &lt;xs:element name="logunit" type="xs:string" minOccurs="0" /&gt;<br />
              &lt;xs:element name="entered" type="xs:string" minOccurs="0" /&gt;<br />
              &lt;xs:element name="produced" type="xs:string" minOccurs="0" /&gt;<br />
              &lt;xs:element name="delivered" type="xs:string" minOccurs="0" /&gt;<br />
            &lt;/xs:sequence&gt;<br />
          &lt;/xs:complexType&gt;<br />
        &lt;/xs:element&gt;<br />
      &lt;/xs:choice&gt;<br />
    &lt;/xs:complexType&gt;<br />
  &lt;/xs:element&gt;<br />
&lt;/xs:schema&gt;<br />
</span>&lt;data&gt;<br />
&lt;period&gt;2010-06-06&lt;/period&gt;<br />
&lt;logunit id="myID"&gt;Milano&lt;/logunit&gt;<br />
&lt;entered matcode="ABC001"&gt;100&lt;/entered&gt;<br />
&lt;produced matcode="ABC002"&gt;101&lt;/produced&gt;<br />
&lt;delivered matcode="ABC002"&gt;100&lt;/delivered&gt;<br />
&lt;description&gt;Caramelline alla fragola&lt;/description&gt;<br />
&lt;updated&gt;2010-06-06T13:05:21+01:00&lt;/updated&gt;<br />
&lt;note&gt;tante belle cose..&lt;/note&gt;<br />
&lt;/data&gt;<br />
&lt;data&gt;<br />
&lt;period&gt;2010-06-06&lt;/period&gt;<br />
&lt;logunit id="myID"&gt;Milano&lt;/logunit&gt;<br />
&lt;entered matcode="ABC001"&gt;100&lt;/entered&gt;<br />
&lt;produced matcode="ABC002"&gt;101&lt;/produced&gt;<br />
&lt;delivered matcode="ABC002"&gt;100&lt;/delivered&gt;<br />
&lt;description&gt;Caramelline alla fragola&lt;/description&gt;<br />
&lt;updated&gt;2010-06-06T13:05:21+01:00&lt;/updated&gt;<br />
&lt;note&gt;tante belle cose..&lt;/note&gt;<br />
&lt;/data&gt;<br />
&lt;/DataSet&gt;</code></p>
<p>Il <strong>risultato finale</strong> sarà quindi una DataGrid che può essere visualizzata come sotto, utilizzando pari pari il <strong>codice C# definito all&#8217;inizio</strong> di questo articolo.</p>
<table id="MyDataGrid2" border="1" cellspacing="0" rules="all">
<tbody>
<tr>
<td>period</td>
<td>description</td>
<td>updated</td>
<td>note</td>
<td>logunit</td>
<td>entered</td>
<td>produced</td>
<td>delivered</td>
</tr>
<tr>
<td>2010-06-06</td>
<td>Caramelline alla fragola</td>
<td>2010-06-16T13:05:21+01:00</td>
<td>tante belle cose..</td>
<td>Milano</td>
<td>100</td>
<td>101</td>
<td>100</td>
</tr>
</tbody>
</table>
<p>Buon divertimento con l&#8217;XML..</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diplod.it/2010/07/13/leggere-e-visualizzare-file-xml-con-c-c-sharp-qualche-esempio/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
