Condividi tramite


Caricamento delle informazioni sullo schema di DataSet da XML

Lo schema di un oggetto DataSet (le relative tabelle, colonne, relazioni e vincoli) può essere definito a livello di codice, creato dai metodi Fill o FillSchema di un DataAdapteroggetto o caricati da un documento XML. Per caricare le informazioni sullo schema di DataSet da un documento XML, è possibile utilizzare il metodo ReadXmlSchema o InferXmlSchemadell'oggetto DataSet. ReadXmlSchema consente di caricare o dedurre informazioni sullo schema dataset dal documento contenente lo schema XSD (XML Schema Definition Language) o un documento XML con XML Schema inline. InferXmlSchema consente di dedurre lo schema dal documento XML ignorando alcuni spazi dei nomi XML specificati.

Annotazioni

L'ordinamento delle tabelle in un oggetto DataSet potrebbe non essere mantenuto quando si utilizzano servizi Web o serializzazione XML per trasferire un oggetto DataSet creato in memoria tramite costrutti XSD, ad esempio relazioni nidificate. Pertanto, il destinatario dell'oggetto DataSet non deve dipendere dall'ordinamento delle tabelle in questo caso. Tuttavia, l'ordinamento delle tabelle viene sempre mantenuto se lo schema del DataSet trasferito è stato letto da file XSD, anziché essere creato in memoria.

ReadXmlSchema

Per caricare lo schema di un oggetto DataSet da un documento XML senza caricare dati, è possibile utilizzare il metodo ReadXmlSchema di DataSet. ReadXmlSchema crea uno schema DataSet definito usando lo schema XSD (XML Schema Definition Language).

Il metodo ReadXmlSchema accetta un singolo argomento di un nome file, un flusso o un XmlReader contenente il documento XML da caricare. Il documento XML può contenere solo lo schema o può contenere 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 il documento XML passato a ReadXmlSchema non contiene informazioni sullo schema inline, ReadXmlSchema dedurrà lo schema dagli elementi del documento XML. Se l'oggetto DataSet contiene già uno schema, lo schema corrente verrà esteso aggiungendo nuove tabelle se non esistono già. Le nuove colonne non verranno aggiunte alle tabelle esistenti. Se nel Set di dati esiste già una colonna da aggiungere ma è presente un tipo incompatibile con la colonna trovata nel codice XML, viene 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.

Anche se ReadXmlSchema carica o deduce solo lo schema di un oggetto DataSet, il metodo ReadXmldell'oggetto DataSet carica o deduce sia lo schema che i dati contenuti nel documento XML. Per altre informazioni, vedere Caricamento di un set di dati da XML.

Negli esempi di codice seguenti viene illustrato come caricare uno schema DataSet da un documento o un flusso XML. Il primo esempio mostra un nome di file di XML Schema passato al metodo ReadXmlSchema . Il secondo esempio mostra un 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

È anche possibile indicare a DataSet di dedurre il relativo schema da un documento XML usando il metodo InferXmlSchemadell'oggetto DataSet. InferXmlSchema funziona allo stesso modo di ReadXml con XmlReadMode di InferSchema (carica dati e inferi schema) e ReadXmlSchema se il documento letto non contiene schemi inline. InferXmlSchema offre tuttavia la funzionalità aggiuntiva che consente di specificare spazi dei nomi XML specifici da ignorare quando viene dedotto lo schema. InferXmlSchema accetta due argomenti obbligatori: il percorso del documento XML, specificato da un nome di file, un flusso o un XmlReader; e una matrice di stringhe di spazi dei nomi XML da ignorare dall'operazione.

Si consideri ad esempio il codice XML seguente:

<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, sia il metodo ReadXmlSchema che il metodo ReadXml con un valore XmlReadMode di InferSchema creano tabelle per ogni elemento del documento: Categories, CategoryID, CategoryName, Description, Products, ProductID, ReorderLevel e Discontinued. Per ulteriori informazioni, vedere Inferring DataSet Relational Structure from XML. Tuttavia, una struttura più appropriata sarebbe creare solo le tabelle Categories e Products, e poi creare le colonne CategoryID, CategoryName e Description nella tabella Categories, e le colonne ProductID, ReorderLevel e Discontinued nella tabella Products. Per assicurarsi che lo schema dedotto ignori gli attributi specificati negli elementi XML, utilizzare il metodo InferXmlSchema e specificare lo spazio dei nomi XML per officedata da ignorare, 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");  

Vedere anche