Chargement d'un DataSet à partir de XML
Le contenu d'un 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 la structure relationnelle du DataSet.
Pour remplir un DataSet de données provenant de XML, utilisez la méthode ReadXml de l'objet DataSet. La méthode ReadXml lit un fichier, un flux ou un XmlReader et prend comme arguments la source du XML et un argument XmlReadMode facultatif. (Pour plus d'informations sur le XmlReader, consultez Lecture de données XML avec XmlTextReader.) La méthode ReadXml lit le contenu du flux ou du document XML et remplit le DataSet de données. Elle créera également le schéma relationnel du DataSet en fonction du XmlReadMode spécifié et selon que ce schéma est ou non déjà défini.
Le tableau suivant décrit les options de l'argument XmlReadMode.
XmlReadMode | Description |
---|---|
Auto | Il s'agit de l'option par défaut. Examine le XML et choisit l'option la mieux appropriée, dans l'ordre suivant :
Si vous connaissez le format du XML lu, il est préférable, pour obtenir de meilleures performances, que vous définissiez un XmlReadMode explicite plutôt que de recourir à l'option par défaut Auto. |
ReadSchema | Lit les schémas inline et charge les données et les schémas.
Si le DataSet contient déjà un schéma, les nouvelles tables sont ajoutées du schéma inline au schéma existant dans le DataSet. Si des tables du schéma inline existent déjà dans le DataSet, une exception est levée. Vous ne pourrez pas modifier le schéma d'une table existante à l'aide de XmlReadMode.ReadSchema. Si le 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 en langage XSD (XML Schema Definition). 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. |
IgnoreSchema | Ignore les schémas inline et charge les données dans le schéma existant du DataSet. Toute donnée ne correspondant pas au schéma existant sera ignorée. S'il n'existe pas de schéma dans le DataSet, aucune donnée n'est chargée.
Si les données sont un DiffGram, IgnoreSchema a la même fonctionnalité 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 nouvelles tables lorsqu'il n'en existe pas, ou par l'ajout de colonnes aux tables existantes. 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 déduites et des colonnes existantes. 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. |
DiffGram | Lit un DiffGram et ajoute les données au schéma en cours. DiffGram fusionne les nouvelles lignes avec les lignes existantes lorsqu'elles ont le même identificateur unique. Consultez le paragraphe « 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 du DataSet sont ajoutés aux tables appropriées. Les autres sont ignorés. |
**Remarque **Si vous passez à ReadXml un XmlReader situé dans un document XML, ReadXml lira jusqu'au nœud d'élément suivant, qu'il considérera comme étant l'élément racine, et ne poursuivra sa lecture que jusqu'à la fin de ce nœud d'élément. Cette règle ne s'applique pas si vous spécifiez XmlReadMode.Fragment.
Entités DTD
Si votre XML contient des entités définies dans un schéma DTD (Document Type Definition), une exception sera levée si vous tentez de charger un DataSet en passant un nom de fichier, un flux ou un XmlReader non validant à ReadXml. Pour éviter cela, vous devez créer un XmlValidatingReader, avec un EntityHandling ayant pour valeur EntityHandling.ExpandEntities, et passer votre XmlValidatingReader à ReadXml. Le XmlValidatingReader développera les entités avant la lecture par le DataSet.
Les exemples de code suivants montrent comment charger un DataSet à partir d'un flux XML. Le premier illustre le cas d'un nom de fichier passé à la méthode ReadXml. Le second illustre le cas d'une chaîne contenant le XML chargé à l'aide d'un System.IO.StringReader.
Dim myDS As DataSet = New DataSet
myDS.ReadXml("input.xml", XmlReadMode.ReadSchema)
[C#]
DataSet myDS = new DataSet();
myDS.ReadXml("input.xml", XmlReadMode.ReadSchema);
[Visual Basic]
Dim myDS As DataSet = New DataSet
Dim myTable As DataTable = New DataTable("table1")
myTable.Columns.Add("col1", Type.GetType("System.String"))
myDS.Tables.Add(myTable)
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)
myDS.ReadXml(xmlSR, XmlReadMode.IgnoreSchema)
[C#]
DataSet myDS = new DataSet();
DataTable myTable = new DataTable("table1");
myTable.Columns.Add("col1", typeof(string));
myDS.Tables.Add(myTable);
string xmlData = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>";
System.IO.StringReader xmlSR = new System.IO.StringReader(xmlData);
myDS.ReadXml(xmlSR, XmlReadMode.IgnoreSchema);
Remarque Si vous appelez ReadXml pour charger un fichier très volumineux, il est possible que vous constatiez une dégradation des performances. Pour garantir les meilleures performances lorsque ReadXml est utilisé avec un fichier volumineux, appelez la méthode DataTable.BeginLoadData pour chaque table du DataSet, puis ReadXml. Enfin, appelez DataTable.EndLoadData pour chaque table du DataSet, comme le montre l'exemple suivant.
Dim t As DataTable
For Each t In ds.Tables
t.BeginLoadData()
Next
ds.ReadXml("file.xml")
For Each t in ds.Tables
t.EndLoadData()
Next
[C#]
foreach (DataTable t in ds.Tables)
t.BeginLoadData();
ds.ReadXml("file.xml");
foreach (DataTable t in ds.Tables)
t.EndLoadData();
Remarque Si le schéma XSD de votre DataSet contient un targetNamespace, les données peuvent ne pas être lues et des exceptions peuvent se produire lorsque vous appellerez ReadXml pour charger le DataSet avec le XML qui contient des éléments sans espace de noms les qualifiant. Dans ce cas, pour lire les éléments non qualifiés, définissez pour elementFormDefault une valeur égale à « qualified » dans votre schéma XSD. Exemple :
<xsd:schema id="MyDataSet"
elementFormDefault="qualified"
targetNamespace="http://www.tempuri.org/MyDataSet.xsd"
xmlns="http://www.tempuri.org/MyDataSet.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 le 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 le DataSet. ReadXml ne fusionne pas les informations de ligne avec les clés primaires correspondantes de XML vers le DataSet. Pour remplacer les informations de ligne existantes par de nouvelles informations provenant de XML, utilisez ReadXml pour créer un nouveau DataSet, puis fusionnez le nouveau DataSet dans le DataSet existant. Notez que charger un DiffGram en utilisant ReadXML avec un argument XmlReadMode ayant pour valeur DiffGram fusionnera les lignes qui ont le même identificateur unique.
Voir aussi
XML et le DataSet | DiffGrams | 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 des informations de schéma d'un DataSet à partir de XML | DataSet.Merge, méthode | Création et utilisation de DataSets