Partager via


Chargement d'un DataSet à partir de XML

Le contenu d'un objet DataSet ADO.NET peut être recréé à partir d'un flux ou d'un document XML. En outre, le .NET Framework vous offre une grande souplesse en ce qui concerne les informations qui seront chargées à partir de XML et le mode de création du schéma ou de la structure relationnelle de l'objet DataSet.

Pour remplir un DataSet avec des données à partir de XML, utilisez la méthode ReadXml de l’objet DataSet. La ReadXml méthode lit à partir d’un fichier, d’un flux ou d’un xmlReader et prend comme arguments la source du code XML et un argument facultatif XmlReadMode . Pour plus d’informations sur XmlReader, consultez Lecture de données XML avec XmlTextReader. La ReadXml méthode lit le contenu du flux XML ou du document et charge les DataSet données. Il créera également le schéma relationnel de la DataSet, en fonction du XmlReadMode spécifié et indiquera si un schéma relationnel existe déjà.

Le tableau suivant décrit les options de l’argument XmlReadMode .

Choix Descriptif
Automatique Il s’agit de la valeur par défaut. Examine le XML et choisit l'option la mieux appropriée, dans l'ordre suivant :

- Si le code XML est un DiffGram, DiffGram est utilisé.
- Si le DataSet contient un schéma ou si le code XML contient un schéma inline, ReadSchema est utilisé.
- Si le DataSet ne contient pas de schéma et que le code XML ne contient pas de schéma inline, InferSchema est utilisé.

Si vous connaissez le format du code XML en cours de lecture, il est recommandé de définir un XmlReadMode explicite, plutôt que d’accepter la Auto valeur par défaut.
ReadSchema Lit les schémas inline et charge les données et les schémas.

Si l'objet DataSet contient déjà un schéma, les nouvelles tables sont ajoutées du schéma inline au schéma existant dans l'objet DataSet. Si des tables du schéma inline existent déjà dans l'objet DataSet, une exception est levée. Vous ne pouvez pas modifier le schéma d’une table existante à l’aide de XmlReadMode.ReadSchema.

Si l'objet DataSet ne contient pas de schéma et qu'il n'existe pas de schéma inline, les données ne sont pas lues.

Un schéma inline peut être défini à l'aide d'un schéma en langage XSD (XML Schema Definition). 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).
IgnoreSchema Ignore les schémas inline et charge les données dans le schéma existant de l'objet DataSet. Toute donnée ne correspondant pas au schéma existant est ignorée. S'il n'existe pas de schéma dans l'objet DataSet, aucune donnée n'est chargée.

Si les données sont un DiffGram, IgnoreSchema ont les mêmes fonctionnalités que DiffGram.
InferSchema Ignore tout schéma inline et déduit le schéma de la structure des données XML, puis charge les données.

Si le DataSet contient déjà un schéma, le schéma en cours est étendu par l'ajout de colonnes dans les tables existantes. Des tables supplémentaires ne seront pas ajoutées s'il n'existe pas de tables. Une exception est levée si une table déduite existe déjà avec un autre espace de noms, ou en cas de conflit entre des colonnes inférées et des colonnes existantes.

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.
DiffGram Lit un DiffGram et ajoute les données au schéma en cours. DiffGram fusionne de nouvelles lignes avec des lignes existantes où correspondent les valeurs d’identificateur uniques. Voir « Fusion de données provenant de XML » à la fin de cette rubrique. Pour plus d’informations sur les DiffGrams, consultez DiffGrams.
fragment Poursuit la lecture de plusieurs fragments XML jusqu'à ce que la fin du flux soit atteinte. Les fragments qui correspondent au schéma de l'objet DataSet sont ajoutés aux tables appropriées. Les fragments qui ne correspondent pas au schéma DataSet sont écartés.

Notes

Si vous passez un XmlReader à un ReadXml qui est positionné à une certaine distance dans un document XML, ReadXml lira le nœud d’élément suivant et le traitera comme l’élément racine, en lisant uniquement jusqu’à la fin du nœud d’élément. Cette règle ne s’applique pas si vous spécifiez XmlReadMode.Fragment.

Entités DTD

Si votre code XML contient des entités définies dans un schéma de définition de type de document (DTD), une exception est levée si vous tentez de charger un DataSet fichier en transmettant XmlReader un nom de fichier, un flux ou une non-validation à ReadXml. Au lieu de cela, vous devez créer un XmlValidatingReader, avec la valeur EntityHandling.ExpandEntities, et passer XmlValidatingReader à ReadXml. L’élément XmlValidatingReader développera les entités avant d’être lu par le DataSet.

Les exemples de code suivants montrent comment charger un objet DataSet à partir d'un flux XML. Le premier exemple montre un nom de fichier passé à la ReadXml méthode. Le second illustre le cas d'une chaîne contenant le XML chargé à l'aide d'un objet StringReader.

Dim dataSet As DataSet = New DataSet
dataSet.ReadXml("input.xml", XmlReadMode.ReadSchema)
DataSet dataSet = new DataSet();
dataSet.ReadXml("input.xml", XmlReadMode.ReadSchema);
Dim dataSet As DataSet = New DataSet
Dim dataTable As DataTable = New DataTable("table1")
dataTable.Columns.Add("col1", Type.GetType("System.String"))
dataSet.Tables.Add(dataTable)

Dim xmlData As String = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>"

Dim xmlSR As System.IO.StringReader = New System.IO.StringReader(xmlData)

dataSet.ReadXml(xmlSR, XmlReadMode.IgnoreSchema)
DataSet dataSet = new DataSet();
DataTable dataTable = new DataTable("table1");
dataTable.Columns.Add("col1", typeof(string));
dataSet.Tables.Add(dataTable);

string xmlData = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>";

System.IO.StringReader xmlSR = new System.IO.StringReader(xmlData);

dataSet.ReadXml(xmlSR, XmlReadMode.IgnoreSchema);

Notes

Si vous appelez ReadXml pour charger un fichier très volumineux, vous pouvez rencontrer des performances lentes. Pour garantir les meilleures performances lorsque ReadXml est utilisé avec un fichier volumineux, appelez la méthode BeginLoadData pour chaque table de l’objet DataSet, puis ReadXml. Enfin, appelez EndLoadData pour chaque table de l'objet DataSet, comme le montre l'exemple suivant.

Dim dataTable As DataTable

For Each dataTable In dataSet.Tables
   dataTable.BeginLoadData()
Next

dataSet.ReadXml("file.xml")

For Each dataTable in dataSet.Tables
   dataTable.EndLoadData()
Next
foreach (DataTable dataTable in dataSet.Tables)
   dataTable.BeginLoadData();

dataSet.ReadXml("file.xml");

foreach (DataTable dataTable in dataSet.Tables)
   dataTable.EndLoadData();

Notes

Si le schéma XSD de votre DataSet élément inclut un targetNamespace, les données peuvent ne pas être lues et vous pouvez rencontrer des exceptions lors de l’appel ReadXml pour charger le DataSet fichier XML contenant des éléments sans espace de noms éligible. Pour lire des éléments non qualifiés dans ce cas, définissez elementFormDefault sur « qualifié » dans votre schéma XSD. Par exemple :

<xsd:schema id="customDataSet"
  elementFormDefault="qualified"
  targetNamespace="http://www.tempuri.org/customDataSet.xsd"
  xmlns="http://www.tempuri.org/customDataSet.xsd"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
</xsd:schema>

Fusion de données provenant de XML

Si l'objet DataSet contient déjà des données, les nouvelles données provenant de XML sont ajoutées aux données déjà présentes dans l'objet DataSet. ReadXml ne fusionne pas du XML dans le DataSet les informations de ligne avec des clés primaires correspondantes. Pour remplacer les informations de ligne existantes avec de nouvelles informations à partir de XML, utilisez ReadXml pour créer un DataSet, puis Merge le nouveau DataSet dans l’existant DataSet. Notez que le chargement d’un DiffGram à l’aide de ReadXML avec un XmlReadMode de DiffGram fusionnera les lignes qui ont le même identificateur unique.

Voir aussi