Chargement d'un DataSet à partir de XMLLoading a DataSet from XML

Le contenu d'un objet DataSet ADO.NET peut être recréé à partir d'un flux ou d'un document XML.The contents of an ADO.NET DataSet can be created from an XML stream or document. 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.In addition, with the .NET Framework you have great flexibility over what information is loaded from XML, and how the schema or relational structure of the DataSet is created.

Pour remplir un DataSet avec des données à partir de XML, utilisez la ReadXml méthode de la DataSet objet.To fill a DataSet with data from XML, use the ReadXml method of the DataSet object. Le ReadXml méthode lit à partir d’un fichier, un flux, ou un XmlReaderet prend comme arguments la source du XML et éventuellement une XmlReadMode argument.The ReadXml method reads from a file, a stream, or an XmlReader, and takes as arguments the source of the XML plus an optional XmlReadMode argument. Pour plus d’informations sur la XmlReader, consultez lecture de données XML avec XmlTextReader.For more information about the XmlReader, see Reading XML Data with XmlTextReader. Le ReadXml méthode lit le contenu du flux de données XML ou document et charge le DataSet avec des données.The ReadXml method reads the contents of the XML stream or document and loads the DataSet with data. Il créera également le schéma relationnel de la DataSet selon le XmlReadMode spécifiés et un schéma relationnel existe déjà ou non.It will also create the relational schema of the DataSet depending on the XmlReadMode specified and whether or not a relational schema already exists.

Le tableau suivant décrit les options pour le XmlReadMode argument.The following table describes the options for the XmlReadMode argument.

OptionOption DescriptionDescription
AutoAuto Il s'agit de la valeur par défaut.This is the default. Examine le XML et choisit l'option la mieux appropriée, dans l'ordre suivant :Examines the XML and chooses the most appropriate option in the following order:

-Si le code XML est un DiffGram, DiffGram est utilisé.- If the XML is a DiffGram, DiffGram is used.
-If le DataSet contient un schéma ou le code XML contient un schéma inline, ReadSchema est utilisé.- If the DataSet contains a schema or the XML contains an inline schema, ReadSchema is used.
-If le DataSet ne contient pas de schéma et le code XML ne contient pas un schéma inline, InferSchema est utilisé.- If the DataSet does not contain a schema and the XML does not contain an inline schema, InferSchema is used.

Si vous connaissez le format du XML en cours de lecture, pour de meilleures performances qu’il est recommandé de définir explicite XmlReadMode, plutôt que d’accepter le automatique par défaut.If you know the format of the XML being read, for best performance it is recommended that you set an explicit XmlReadMode, rather than accept the Auto default.
ReadSchemaReadSchema Lit les schémas inline et charge les données et les schémas.Reads any inline schema and loads the data and schema.

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.If the DataSet already contains a schema, new tables are added from the inline schema to the existing schema in the DataSet. Si des tables du schéma inline existent déjà dans l'objet DataSet, une exception est levée.If any tables in the inline schema already exist in the DataSet, an exception is thrown. Vous ne pourrez pas modifier le schéma d’une table existante à l’aide XmlReadMode.ReadSchema.You will not be able to modify the schema of an existing table using 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.If the DataSet does not contain a schema, and there is no inline schema, no data is read.

Un schéma inline peut être défini à l'aide d'un schéma en langage XSD (XML Schema Definition).Inline schema can be defined using XML Schema definition language (XSD) schema. Pour plus d’informations sur l’écriture de schéma inline sous forme de schéma XML, consultez dérivation Structure relationnelle des DataSet à partir de XSD (XML Schema).For details about writing inline schema as XML Schema, see Deriving DataSet Relational Structure from XML Schema (XSD).
IgnoreSchemaIgnoreSchema Ignore les schémas inline et charge les données dans le schéma existant de l'objet DataSet.Ignores any inline schema and loads the data into the existing DataSet schema. Toute donnée ne correspondant pas au schéma existant est ignorée.Any data that does not match the existing schema is discarded. S'il n'existe pas de schéma dans l'objet DataSet, aucune donnée n'est chargée.If no schema exists in the DataSet, no data is loaded.

Si les données sont un DiffGram, IgnoreSchema a les mêmes fonctionnalités que DiffGram .If the data is a DiffGram, IgnoreSchema has the same functionality as DiffGram .
InferSchemaInferSchema Ignore tout schéma inline et déduit le schéma de la structure des données XML, puis charge les données.Ignores any inline schema and infers the schema per the structure of the XML data, then loads the data.

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.If the DataSet already contains a schema, the current schema is extended by adding columns to existing tables. Des tables supplémentaires ne seront pas ajoutées s'il n'existe pas de tables.Extra tables will not be added if there are not existing 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.An exception is thrown if an inferred table already exists with a different namespace, or if any inferred columns conflict with existing columns.

Pour plus d’informations sur la façon ReadXmlSchema déduit un schéma à partir d’un document XML, consultez déduction Structure relationnelle des DataSet à partir de XML.For details about how ReadXmlSchema infers a schema from an XML document, see Inferring DataSet Relational Structure from XML.
DiffGramDiffGram Lit un DiffGram et ajoute les données au schéma en cours.Reads a DiffGram and adds the data to the current schema. DiffGram fusionne les nouvelles lignes avec les lignes existantes lorsqu’elles ont l’identificateur unique.DiffGram merges new rows with existing rows where the unique identifier values match. Voir « Fusion de données provenant de XML » à la fin de cette rubrique.See "Merging Data from XML" at the end of this topic. Pour plus d’informations sur DiffGrams, consultez DiffGrams.For more information about DiffGrams, see DiffGrams.
FragmentFragment Poursuit la lecture de plusieurs fragments XML jusqu'à ce que la fin du flux soit atteinte.Continues reading multiple XML fragments until the end of the stream is reached. Les fragments qui correspondent au schéma de l'objet DataSet sont ajoutés aux tables appropriées.Fragments that match the DataSet schema are appended to the appropriate tables. Les fragments qui ne correspondent pas au schéma DataSet sont écartés.Fragments that do not match the DataSet schema are discarded.

Notes

Si vous passez un XmlReader à ReadXml qui constitue une partie de la migration dans un document XML, positionnée ReadXml lira jusqu’au nœud d’élément suivant et qui traitera comme la racine élément, la lecture jusqu'à la fin du nœud d’élément uniquement.If you pass an XmlReader to ReadXml that is positioned part of the way into an XML document, ReadXml will read to the next element node and will treat that as the root element, reading until the end of the element node only. Cela ne s’applique pas si vous spécifiez XmlReadMode.Fragment.This does not apply if you specify XmlReadMode.Fragment.

Entités DTDDTD Entities

Si votre XML contient des entités définies dans un schéma DTD (définition) de type de document, une exception sera levée si vous tentez de charger un DataSet en passant un fichier de nom, un flux ou non validant XmlReader à ReadXml.If your XML contains entities defined in a document type definition (DTD) schema, an exception will be thrown if you attempt to load a DataSet by passing a file name, stream, or non-validating XmlReader to ReadXml. Au lieu de cela, vous devez créer un XmlValidatingReader, avec EntityHandling définie sur EntityHandling.ExpandEntitieset passer votre XmlValidatingReader à ReadXml.Instead, you must create an XmlValidatingReader, with EntityHandling set to EntityHandling.ExpandEntities, and pass your XmlValidatingReader to ReadXml. Le XmlValidatingReader développera les entités avant la lecture par le DataSet.The XmlValidatingReader will expand the entities prior to being read by the DataSet.

Les exemples de code suivants montrent comment charger un objet DataSet à partir d'un flux XML.The following code examples show how to load a DataSet from an XML stream. Le premier exemple montre un nom de fichier passé à la ReadXml (méthode).The first example shows a file name being passed to the ReadXml method. Le second illustre le cas d'une chaîne contenant le XML chargé à l'aide d'un objet StringReader.The second example shows a string that contains XML being loaded using a 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 le ralentissement des performances.If you call ReadXml to load a very large file, you may encounter slow performance. Pour garantir les meilleures performances ReadXml, sur un fichier volumineux, appelez le BeginLoadData méthode pour chaque table dans le DataSet, puis appelez ReadXml.To ensure best performance for ReadXml, on a large file, call the BeginLoadData method for each table in the DataSet, and then call ReadXml. Enfin, appelez EndLoadData pour chaque table de l'objet DataSet, comme le montre l'exemple suivant.Finally, call EndLoadData for each table in the DataSet, as shown in the following example.

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 inclut un targetNamespace, les données ne peuvent pas être lues et vous pouvez rencontrer des exceptions, lors de l’appel ReadXml pour charger le DataSet avec XML qui contient éléments sans espace de noms qualifiant.If the XSD schema for your DataSet includes a targetNamespace, data may not be read, and you may encounter exceptions, when calling ReadXml to load the DataSet with XML that contains elements with no qualifying namespace. Pour lire des éléments non qualifiés dans ce cas, définissez elementFormDefault égale à « qualified » dans votre schéma XSD.To read unqualified elements in this case, set elementFormDefault equal to "qualified" in your XSD schema. Exemple :For example:

<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 XMLMerging Data from 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.If the DataSet already contains data, the new data from the XML is added to the data already present in the DataSet. ReadXml ne fusionne pas à partir du XML dans le DataSet les informations de ligne avec des clés primaires correspondantes.ReadXml does not merge from the XML into the DataSet any row information with matching primary keys. Pour remplacer les informations de ligne existantes avec de nouvelles informations à partir de XML, utilisez ReadXml pour créer un nouveau DataSet, puis Merge le nouveau DataSet dans existant DataSet.To overwrite existing row information with new information from XML, use ReadXml to create a new DataSet, and then Merge the new DataSet into the existing DataSet. Notez que charger un DiffGram en utilisant ReadXML avec un XmlReadMode de DiffGram fusionnera les lignes qui ont le même identificateur unique.Note that loading a DiffGram using ReadXML with an XmlReadMode of DiffGram will merge rows that have the same unique identifier.

Voir aussiSee also