Partager via


Chargement des informations de schéma DataSet à partir de XML

Le schéma d’un DataSet (ses tables, colonnes, relations et contraintes) peut être défini par programme, créé par les méthodes Fill ou FillSchema d’un DataAdapter, ou chargé à partir d’un document XML. Pour charger les informations de schéma à partir d’un document XML, vous pouvez utiliser soit la méthode ReadXmlSchema, soit la méthode InferXmlSchema du DataSet. ReadXmlSchema vous permet de charger ou d’inférer DataSet des informations de schéma à partir du document contenant le schéma XSD (XML Schema Definition Language) ou un document XML avec schéma XML inline. InferXmlSchema vous permet d’inférer le schéma à partir du document XML tout en ignorant certains espaces de noms XML que vous spécifiez.

Remarque

L’ordre de table dans un DataSet fichier peut ne pas être conservé lorsque vous utilisez des services Web ou une sérialisation XML pour transférer un DataSet objet créé en mémoire à l’aide de constructions XSD (telles que les relations imbriquées). Par conséquent, le destinataire du DataSet ne doit pas compter sur l'ordonnancement des tables dans ce cas. Toutefois, l’ordre des tables est toujours conservé si le schéma du DataSet transfert a été lu à partir de fichiers XSD, au lieu d’être créé en mémoire.

ReadXmlSchema

Pour charger le schéma d’un DataSet document XML sans charger de données, vous pouvez utiliser la ReadXmlSchema méthode de DataSet. ReadXmlSchema crée un DataSet schéma défini à l’aide du schéma XSD (XML Schema Definition Language).

La méthode ReadXmlSchema prend un seul argument, qui peut être un nom de fichier, un flux ou un XmlReader contenant le document XML à charger. Le document XML peut contenir uniquement un schéma ou contenir un schéma inline avec des éléments XML contenant des données. Pour plus d’informations sur l’écriture d’un schéma inline en tant que schéma XML, consultez La dérivation de la structure relationnelle dataSet à partir du schéma XML (XSD).

Si le document XML passé à ReadXmlSchema ne contient aucune information de schéma inline, ReadXmlSchema déduit le schéma des éléments du document XML. Si le DataSet contient déjà un schéma, le schéma actuel sera étendu par l'ajout de nouvelles tables si elles n'existent pas déjà. Les nouvelles colonnes ne seront pas ajoutées à des tables existantes. Si une colonne en cours d’ajout existe déjà dans l’objet DataSet mais qu’elle a un type incompatible avec la colonne trouvée dans le code XML, une exception est levée. Pour plus d’informations sur l’inférence ReadXmlSchema d’un schéma à partir d’un document XML, consultez Inferring DataSet Relational Structure from XML.

Bien que ReadXmlSchema charge ou déduit uniquement le schéma d’un DataSet, la ReadXml méthode des DataSet charges ou déduit à la fois le schéma et les données contenues dans le document XML. Pour plus d’informations, consultez Chargement d’un DataSet à partir de XML.

Les exemples de code suivants montrent comment charger un DataSet schéma à partir d’un document ou d’un flux XML. Le premier exemple montre un nom de fichier de schéma XML passé à la ReadXmlSchema méthode. Le deuxième exemple montre 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

Vous pouvez également indiquer à l’utilisateur DataSet de déduire son schéma à partir d’un document XML à l’aide de la InferXmlSchema méthode de DataSet. InferXmlSchema fonctionne de la même manière que ReadXml et XmlReadMode (charge des données ainsi qu'infère le schéma) et ReadXmlSchema si le document lu ne contient aucun schéma intégré. Toutefois, InferXmlSchema fournit la fonctionnalité supplémentaire permettant de spécifier des espaces de noms XML particuliers à ignorer lorsque le schéma est déduit. InferXmlSchema prend deux arguments requis : l’emplacement du document XML, spécifié par un nom de fichier, un flux ou un XmlReader ; et un tableau de chaînes d’espaces de noms XML à ignorer par l’opération.

Par exemple, considérez le code XML suivant :

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

En raison des attributs spécifiés pour les éléments du document XML précédent, la ReadXmlSchema méthode et la ReadXml méthode avec un XmlReadMode des InferSchema éléments créeraient des tables pour chaque élément du document : Categories, CategoryID, CategoryName, Description, Products, ProductID, ReorderLevel et Discontinued. (Pour plus d’informations, consultez Inferring DataSet Relational Structure from XML.) Toutefois, une structure plus appropriée serait de créer uniquement les Categories tables et Products les tables, puis de créer CategoryID, CategoryName et Description colonnes dans la Categories table, et ProductID, ReorderLevel et Discontinued colonnes de la Products table. Pour vous assurer que le schéma déduit ignore les attributs spécifiés dans les éléments XML, utilisez la InferXmlSchema méthode et spécifiez l’espace de noms XML à officedata ignorer, comme illustré dans l’exemple suivant.

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");

Voir aussi