Chargement des informations de schéma de DataSet à partir de XML
Le schéma d’un objet DataSet (ses tables, colonnes, relations et contraintes) peut être défini par programme, créé par la méthode Fill ou FillSchema d'un objet DataAdapter ou chargé à partir d’un document XML. Pour charger les informations de schéma d’un DataSet à partir d’un document XML, vous pouvez utiliser la méthode ReadXmlSchema or the InferXmlSchema du DataSet. ReadXmlSchema vous permet de charger ou de déduire les informations de schéma du DataSet à partir du document contenant le schéma en langage XSD (XML Schema Definition) ou d’un document XML avec le schéma XML inlined. InferXmlSchema vous permet de déduire le schéma à partir du document XML tout en ignorant certains espaces de noms XML que vous spécifiez.
Notes
Le classement des tables d’un DataSet peut ne pas être préservé lorsque vous utilisez des services web ou la sérialisation XML pour transférer un DataSet créé en mémoire à l’aide de constructions XSD (telles que des relations imbriquées). Par conséquent, le destinataire du DataSet ne doit pas dépendre du classement des tables dans ce cas. Toutefois, le classement des tables est toujours préservé si le schéma du DataSet transféré a été lu à partir des fichiers XSD, au lieu d’être créé en mémoire.
ReadXmlSchema
Pour charger le schéma d’un DataSet à partir d’un document XML sans charger les données, vous pouvez utiliser la méthode ReadXmlSchema du DataSet. ReadXmlSchema crée le schéma du DataSet à l’aide du schéma en langage XSD (XML Schema Definition).
La méthode ReadXmlSchema accepte un argument unique représentant le nom d’un fichier, un flux ou un XmlReader contenant le document XML à charger. Le document XML peut contenir uniquement le schéma ou contenir le schéma inline avec des éléments XML contenant des données. Pour plus d’informations sur l’écriture de schéma inlined en tant que schéma XML, consultez Dérivation de la structure relationnelle des DataSet à partir du schéma XML (XSD).
Si le document XML passé à ReadXmlSchema ne contient aucune information de schéma inlined, ReadXmlSchema déduit le schéma des éléments figurant dans le document XML. Si le DataSet contient déjà un schéma, le schéma en cours est étendu moyennant l’ajout de nouvelles tables si elles n’existent pas encore. De nouvelles colonnes ne seront pas ajoutées aux tables existantes. Si une colonne ajoutée existe déjà dans le DataSet, mais que son type est incompatible avec la colonne trouvée dans le XML, une exception est levée. Pour plus d’informations sur la façon dont ReadXmlSchema déduit un schéma à partir d’un document XML, consultez Déduction de la structure relationnelle des DataSet à partir de XML.
Bien que ReadXmlSchema charge ou déduit uniquement le schéma d’un DataSet, la méthode ReadXml du DataSet charge ou déduit 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 le schéma d’un DataSet à partir d’un document ou d’un flux XML. Le premier exemple illustre le cas d’un nom de fichier de schéma XML passé à la méthode ReadXmlSchema. Le second exemple utilise 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 faire en sorte que le DataSet déduise son schéma à partir d’un document XML en utilisant la méthode InferXmlSchema du DataSet. InferXmlSchema fonctionne de la même manière que ReadXml avec un XmlReadMode ayant pour valeur InferSchema (charge les données et déduit le schéma) et ReadXmlSchema si le document lu ne contient pas de schéma inlined. Toutefois, InferXmlSchema offre en plus la possibilité de spécifier les espaces de noms XML qui doivent être ignorés lorsque le schéma est déduit. InferXmlSchema utilise deux arguments requis : l’emplacement du document XML, spécifié par un nom de fichier, un flux ou un XmlReader ; un tableau de chaînes spécifiant les espaces de noms XML qui doivent être ignorés au cours de l’opération.
Examinons, par exemple, 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 dans le document XML précédent, les méthodes ReadXmlSchema et ReadXml avec un XmlReadMode de InferSchema créent des tables pour chaque élément du document : Categories, CategoryID, CategoryName, Description, Products, ProductID, ReorderLevel et Discontinued. (Pour plus d’informations, consultez Déduction de la structure relationnelle des DataSet à partir de XML.) Toutefois, une structure plus appropriée consiste à créer, dans un premier temps, les tables Categories et Products, puis les colonnes CategoryID, CategoryName et Description dans la table Categories et enfin, les colonnes ProductID, ReorderLevel et Discontinued dans la table Products. Pour vous assurer que le schéma déduit ignore les attributs spécifiés dans les éléments XML, utilisez la méthode InferXmlSchema et faites en sorte que l’espace de noms XML de officedata soit ignoré, comme le montre 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");