Chargement des informations de schéma d'un DataSet à partir de XML
Le schéma d'un DataSet (ses tables, colonnes, relations et contraintes) peut être défini par programme, créé par une méthode Fill ou FillSchema d'un 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 le ReadXmlSchema ou la méthode 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 inline. 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.
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 d'un schéma inline sous forme de schéma XSD, consultez Génération de la structure relationnelle d'un DataSet à partir de XSD.
Si le document XML passé à ReadXmlSchema ne contient pas d'informations de schéma inline, ReadXmlSchema déduira le schéma des éléments figurant dans ce document. Si le DataSet contient déjà un schéma, le schéma en cours sera étendu par l'ajout de nouvelles colonnes aux tables existantes ou, en l'absence de tables, par l'ajout de nouvelles tables. 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 Inférence de la structure relationnelle d'un DataSet à partir de XML.
Si ReadXmlSchema charge ou déduit uniquement le schéma d'un DataSet, la méthode ReadXml du DataSet charge ou déduit et 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 illustre le cas d'un nom de fichier de schéma XML passé à la méthode ReadXmlSchema. Le second exemple utilise un objet System.IO.StreamReader.
Dim myDS As DataSet = New DataSet
myDS.ReadXmlSchema("schema.xsd")
[C#]
DataSet myDS = new DataSet();
myDS.ReadXmlSchema("schema.xsd");
[Visual Basic]
Dim xmlStream As System.IO.StreamReader = New System.IO.StreamReader ("schema.xsd");
Dim myDS As DataSet = New DataSet
myDS.ReadXmlSchema(xmlStream)
xmlStream.Close()
[C#]
System.IO.StreamReader xmlStream = new System.IO.StreamReader("schema.xsd");
DataSet myDS = new DataSet();
myDS.ReadXmlSchema(xmlStream);
xmlStream.Close();
InferXmlSchema
Vous pouvez également faire en sorte que le DataSet déduise son schéma d'un document XML en utilisant la méthode InferXmlSchema du DataSet. InferXmlSchema fonctionne de la même manière que ReadXml avec un argument 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 inline. Toutefois, InferXmlSchema offre en plus la possibilité de spécifier les espaces de noms qui doivent être ignorés lorsque le schéma est déduit. InferXmlSchema accepte deux arguments requis : l'emplacement du document XML, spécifié par un nom de fichier, un flux ou un XmlReader d'une part, et d'autre part, 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>
À cause des attributs spécifiés pour les éléments du document XML précédent, la méthode ReadXmlSchema, ainsi que la méthode ReadXml avec l'argument XmlReadMode ayant pour valeur InferSchema, créeraient toutes deux des tables pour chaque élément figurant dans le document : Categories, CategoryID, CategoryName, Description, Products, ProductID, ReorderLevel et Discontinued. (Pour plus d'informations, consultez Inférence de la structure relationnelle d'un DataSet à partir de XML.) Toutefois, une structure plus appropriée voudrait dans un premier temps que seules les tables Categories et Products soient créées, et dans un deuxième temps que soient créées les colonnes CategoryID, CategoryName et Description pour la table Categories et les colonnes ProductID, ReorderLevel et Discontinued pour 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 de officedata soit ignoré, comme le montre l'exemple suivant.
Dim myDS As DataSet = New DataSet
myDS.InferXmlSchema("input_od.xml", New String[] {"urn:schemas-microsoft-com:officedata"})
[C#]
DataSet myDS = new DataSet();
myDS.InferXmlSchema("input_od.xml", new string[] "urn:schemas-microsoft-com:officedata");
Voir aussi
XML et le DataSet | Génération de la structure relationnelle d'un DataSet à partir de XSD | Inférence de la structure relationnelle d'un DataSet à partir de XML | Chargement d'un DataSet à partir de XML | Création et utilisation de DataSets