Загрузка DataSet из XML (ADO.NET)

Обновлен: November 2007

Содержимое объекта DataSet технологии ADO.NET может быть создано на основе XML-потока или XML-документа. Кроме того, использование .NET Framework обеспечивает большую гибкость при выборе сведений, загружаемых из XML, а также способа создания схемы или реляционной структуры DataSet.

Для заполнения объекта DataSet данными из XML следует использовать метод ReadXml объекта DataSet. Метод ReadXml считывает данные из файла, потока или объекта XmlReader, а в качестве аргумента принимает источник XML и еще один дополнительный аргумент, XmlReadMode. (Дополнительные сведения о XmlReader см. в разделе Чтение XML-данных с помощью XmlTextReader.) Метод ReadXml считывает содержимое XML-потока или XML-документа и загружает данные в DataSet. Он также создаст реляционную схему DataSet в зависимости от указанного значения XmlReadMode, а также от наличия или отсутствия реляционной схемы.

В следующей таблице описаны параметры для аргумента XmlReadMode.

Параметр

Описание

Auto

Это значение задано по умолчанию. Анализирует XML и выбирает наиболее подходящий параметр в следующем порядке.

  • Если код XML относится к типу DiffGram, используется значение DiffGram.

  • Если набор данных DataSet содержит схему или XML-код содержит встроенную схему, используется значение ReadSchema.

  • Если набор данных DataSet не содержит схему и XML-код не содержит встроенную схему, используется значение InferSchema.

Если известен формат считанного XML-кода, для достижения наибольшей производительности рекомендуется явно задавать значение аргумента XmlReadMode, а не принимать значение Auto, заданное по умолчанию.

ReadSchema

Считывает любую встроенную схему и загружает данные и схему.

Если набор данных DataSet уже содержит схему, новые таблицы добавляются из встроенной схемы в существующую в наборе данных DataSet. Если любая таблица встроенной схемы уже существует в наборе данных DataSet, возникает исключение. Возможность изменить схему существующей таблицы с помощью метода XmlReadMode.ReadSchema отсутствует.

Если набор данных DataSet не содержит схему, а также отсутствует встроенная схема, то данные не считываются.

Встроенная схема может быть определена с помощью схемы на языке XSD. Дополнительные сведения о записи встроенной схемы в виде схемы XML см. в разделе Выведение реляционной структуры DataSet из схемы XML (XSD).

IgnoreSchema

Не учитывает любую встроенную схему и загружает данные в существующую схему DataSet. Любые данные, не совпадающие с существующей схемой, удаляются. Если схема не существует в наборе данных DataSet, данные не загружаются.

Если данные относятся к типу DiffGram, значение IgnoreSchema предоставляет такие же функциональные возможности, что и DiffGram.

InferSchema

Не учитывает любую встроенную схему и формирует по одной схеме в расчете на каждую структуру XML-данных, а затем загружает данные.

Если набор данных DataSet уже содержит схему, текущая схема расширяется путем добавления столбцов в существующие таблицы. Дополнительные таблицы не будут добавлены, если отсутствуют существующие таблицы. Если уже существует формируемая таблица с другим пространством имен или любой из формируемых столбцов конфликтует с существующими столбцами, то возникает исключение.

Дополнительные сведения о том, как ReadXmlSchema выводит схему из XML-документа, см. в разделе Вывод реляционной структуры DataSet из XML (ADO.NET).

DiffGram

Считывает данные DiffGram и добавляет их в текущую схему. В данных DiffGram производится слияние новых строк с существующими строками, в которых совпадают уникальные идентифицирующие значения. См. подраздел «Слияние данных из XML» в конце данного раздела. Дополнительные сведения о DiffGram см. в разделе Объекты DiffGram (ADO.NET).

Fragment

Продолжает считывание нескольких XML-фрагментов до достижения конца потока. Фрагменты, совпадающие со схемой DataSet, добавляются в соответствующие таблицы. Фрагменты, не совпадающие со схемой DataSet, удаляются.

fx29c3yd.alert_note(ru-ru,VS.90).gifПримечание.

Если после передачи объекта XmlReader в метод ReadXml обнаруживается, что этот объект является позиционированной частью пути в XML-документе, метод ReadXml производит считывание до следующего узла элемента и рассматривает его в качестве корневого элемента, считывая только до конца узла элемента. Это действие не применяется, если указан метод XmlReadMode.Fragment.

Сущности DTD

Если XML содержит сущности, заданные в схеме определения DTD, то возникает исключение при попытке загрузки набора данных DataSet путем передачи имени файла, потока или не выполняющего проверку правильности объекта XmlReader в ReadXml. Вместо этого необходимо создать объект XmlValidatingReader, присвоив аргументу EntityHandling значение EntityHandling.ExpandEntities, и передать объект XmlValidatingReader в метод ReadXml. Объект XmlValidatingReader развертывает сущности до его считывания в набор данных DataSet.

В следующих примерах кода показаны способы загрузки набора данных DataSet из XML-потока. В первом примере показана передача имени файла методу ReadXml. Во втором примере показана загрузка строки, содержащей XML-код, с помощью объекта 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);
fx29c3yd.alert_note(ru-ru,VS.90).gifПримечание.

При попытке вызвать метод ReadXml для загрузки файла с очень большими размерами может оказаться, что производительность является низкой. Чтобы обеспечить наилучшую производительность при использовании метода ReadXml применительно к файлу большого размера, вызывайте метод BeginLoadData для каждой таблицы в наборе данных DataSet и затем вызывайте метод ReadXml. Наконец, вызывайте метод EndLoadData для каждой таблицы в наборе данных DataSet, как показано в следующем примере.

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();
fx29c3yd.alert_note(ru-ru,VS.90).gifПримечание.

Если схема XSD для набора данных DataSet включает пространство имен targetNamespace, то данные не могут быть считаны, поэтому при вызове метода ReadXml для загрузки в набор данных DataSet XML-кода, содержащего элементы без указанного пространства имен, может возникнуть исключение. В данном случае для считывания элементов с неполными именами в схеме XSD следует установить значение elementFormDefault равным «qualified». Например:

<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>

Слияние данных из XML

Если набор данных DataSet уже содержит данные, новые данные из XML-кода добавляются к данным, находящимся в наборе данных DataSet. Метод ReadXml не переносит слиянием из XML-кода в набор данных DataSet никаких данных из строк с совпадающими первичными ключами. Для перезаписи существующих данных в строках новыми данными из XML-кода следует использовать метод ReadXml для создания нового набора данных DataSet, а затем использовать метод Merge, чтобы выполнить слияние набора данных DataSet с существующим набором данных DataSet. Обратите внимание, что при загрузке данных DiffGram с использованием метода ReadXML со значением параметра XmlReadMode, равным DiffGram, происходит слияние строк, имеющих одинаковый уникальный идентификатор.

См. также

Основные понятия

Объекты DiffGram (ADO.NET)

Загрузка сведений о схеме DataSet из XML (ADO.NET)

Ссылки

DataSet.Merge

Другие ресурсы

Использование XML в DataSet (ADO.NET)

Выведение реляционной структуры DataSet из схемы XML (XSD)

Вывод реляционной структуры DataSet из XML (ADO.NET)

Объекты DataSet, DataTable и DataView (ADO.NET)