Caricamento delle informazioni dello schema di dataset da XML

È possibile definire a livello di programmazione lo schema di un DataSet (le tabelle, le colonne, le relazioni e i vincoli), creare tale schema mediante i metodi Fill o FillSchema di un DataAdapter oppure caricarlo da un documento XML. Per caricare informazioni relative allo schema di un DataSet da un documento XML, è possibile usare il metodo ReadXmlSchema o il metodo InferXmlSchema del DataSet. Il metodo ReadXmlSchema consente di caricare o inferire le informazioni relative allo schema del DataSet dal documento contenente lo schema XSD (XML Schema Definition Language) o da un documento XML con XML Schema inline. Il metodo InferXmlSchema consente di inferire lo schema dal documento XML, ignorando allo stesso tempo determinati spazi dei nomi XML specificati dall'utente.

Nota

L'ordine delle tabelle in un DataSet potrebbe non essere mantenuto quando si usano i servizi Web o la serializzazione XML per trasferire un DataSet creato in memoria usando costrutti XSD (ad esempio relazioni annidate). Pertanto, il destinatario del DataSet non deve dipendere dall'ordine delle tabelle in questo caso. Tuttavia, l'ordine delle tabelle viene sempre mantenuto se lo schema del DataSet da trasferire è stato letto da file XSD anziché essere creato in memoria.

ReadXmlSchema

Per caricare lo schema di un DataSet da un documento XML senza caricare alcun dato, è possibile usare il metodo ReadXmlSchema del DataSet. ReadXmlSchema crea uno schema di DataSet definito tramite lo schema XSD (XML Schema Definition Language).

Il metodo ReadXmlSchema accetta come unico argomento un nome file, un flusso o un XmlReader contenente il documento XML da caricare. È possibile che nel documento XML sia contenuto solo lo schema, oppure che in tale documento sia contenuto lo schema inline con elementi XML contenenti dati. Per informazioni dettagliate sulla scrittura dello schema inline come XML Schema, vedere Derivazione della struttura relazionale di dataset da XML Schema (XSD).

Se nel documento XML passato a ReadXmlSchema non sono contenute informazioni relative allo schema inline, lo schema viene inferito da ReadXmlSchema sulla base degli elementi presenti nel documento XML. Se nel DataSet è già presente uno schema, lo schema corrente viene esteso tramite l'aggiunta di nuove tabelle, se non sono già esistenti. Nelle tabelle esistenti non verranno aggiunte nuove colonne. Se una colonna aggiunta esiste già nel DataSet, ma il tipo di tale colonna non è compatibile con la colonna rilevata nel documento o flusso XML, verrà generata un'eccezione. Per informazioni dettagliate su come ReadXmlSchema deduce uno schema da un documento XML, vedere Deduzione della struttura relazionale di dataset da XML.

Mentre ReadXmlSchema consente di caricare o inferire solo lo schema di un DataSet, il metodo ReadXml del DataSet consente di caricare o inferire sia lo schema che i dati contenuti nel documento XML. Per altre informazioni, vedere Caricamento di un dataset da XML.

Nell'esempio di codice seguente viene illustrato il caricamento dello schema di un DataSet da un documento o flusso XML. Nel primo esempio viene mostrato il passaggio di un nome file di XML Schema al metodo ReadXmlSchema. Nel secondo esempio viene mostrato un oggetto System.IO.StreamReader.

Dim dataSet As DataSet = New DataSet  
dataSet.ReadXmlSchema("schema.xsd")  
DataSet dataSet = new DataSet();  
dataSet.ReadXmlSchema("schema.xsd");  
Dim xmlStream As New System.IO.StreamReader("schema.xsd")
Dim dataSet As DataSet = New DataSet  
dataSet.ReadXmlSchema(xmlStream)  
xmlStream.Close()  
System.IO.StreamReader xmlStream = new System.IO.StreamReader("schema.xsd");  
DataSet dataSet = new DataSet();  
dataSet.ReadXmlSchema(xmlStream);  
xmlStream.Close();  

InferXmlSchema

È inoltre possibile impostare l'oggetto DataSet in modo che lo schema venga dedotto da un documento XML mediante il metodo InferXmlSchema di DataSet. Il funzionamento del metodo InferXmlSchema è simile a quello di ReadXml con XmlReadMode pari a InferSchema (consente il caricamento dei dati e l'inferenza dello schema) e di ReadXmlSchema, nel caso in cui nel documento letto non sia presente alcuno schema inline. Tuttavia, il metodo InferXmlSchema offre un'ulteriore possibilità, consentendo di specificare dei particolari spazi dei nomi XML da ignorare durante l'inferenza dello schema. InferXmlSchema accetta due argomenti necessari: la posizione del documento XML, specificata da un nome file, un flusso o un oggetto XmlReader e una matrice di stringhe degli spazi dei nomi XML che verranno ignorati dall'operazione.

Ad esempio, si consideri il seguente codice XML:

<NewDataSet xmlns:od="urn:schemas-microsoft-com:officedata">  
<Categories>  
  <CategoryID od:adotype="3">1</CategoryID>
  <CategoryName od:maxLength="15" od:adotype="130">Beverages</CategoryName>
  <Description od:adotype="203">Soft drinks and teas</Description>
</Categories>  
<Products>  
  <ProductID od:adotype="20">1</ProductID>
  <ReorderLevel od:adotype="3">10</ReorderLevel>
  <Discontinued od:adotype="11">0</Discontinued>
</Products>  
</NewDataSet>  

A causa degli attributi specificati per gli elementi nel documento XML precedente, il metodo ReadXmlSchema e il metodo ReadXml con un oggetto XmlReadMode di InferSchema creeranno tabelle per ogni elemento del documento: Categories, CategoryID, CategoryName, Description, Products, ProductID, ReorderLevel e Discontinued. Per altre informazioni, vedere Deduzione della struttura relazionale di dataset da XML. Una struttura più appropriata implicherebbe tuttavia la creazione delle sole tabelle Categories e Products, seguita dalla creazione delle colonne CategoryID, CategoryName e Description nella tabella Categories e delle colonne ProductID, ReorderLevel e Discontinued nella tabella Products. Per assicurarsi che gli attributi specificati negli elementi XML vengano ignorati dallo schema inferito, usare il metodo InferXmlSchema e fare in modo che lo spazio dei nomi XML per officedata venga ignorato, come illustrato nell'esempio seguente.

Dim dataSet As DataSet = New DataSet  
dataSet.InferXmlSchema("input_od.xml", New String() {"urn:schemas-microsoft-com:officedata"})  
DataSet dataSet = new DataSet();  
dataSet.InferXmlSchema("input_od.xml", new string[] "urn:schemas-microsoft-com:officedata");  

Vedi anche