Поделиться через


Загрузка набора данных из XML

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

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

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

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

— Если XML представлен как DiffGram, используется DiffGram.
— Если DataSet содержит схему или XML-файл содержит встроенную схему, ReadSchema используется.
— Если DataSet не содержит схему, а XML не содержит встроенную схему, используется InferSchema.

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

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

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

Встроенная схема может быть определена с помощью языка определения схем XML (XSD). Дополнительные сведения о написании встроенной схемы в виде XML-схемы см. в разделе "Вывод реляционной структуры набора данных" из схемы XML (XSD).
ИгнорироватьСхему Не учитывает любую встроенную схему и загружает данные в существующую схему DataSet. Любые данные, не совпадающие с существующей схемой, удаляются. Если схема не существует в наборе данных DataSet, данные не загружаются.

имеет те же функции, что и , если данные являются DiffGram.
InferSchema Игнорирует встроенную схему и выводит схему на основе структуры XML-данных, затем загружает данные.

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

Дополнительные сведения о том, как ReadXmlSchema выводит схему из XML-документа, см. в разделе Вывод реляционной структуры набора данных из XML.
DiffGram Считывает данные DiffGram и добавляет их в текущую схему. DiffGram объединяет новые строки с существующими строками, где совпадают уникальные значения идентификаторов. См. подраздел «Слияние данных из XML» в конце данного раздела. Дополнительные сведения о DiffGrams см. в разделе DiffGrams.
Фрагмент Продолжает считывание нескольких XML-фрагментов до достижения конца потока. Фрагменты, совпадающие со схемой DataSet, добавляются в соответствующие таблицы. Фрагменты, не совпадающие со схемой DataSet, удаляются.

Примечание.

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

Сущности DTD

Если XML содержит сущности, определенные в схеме DTD (Document Type Definition), будет вызвано исключение при попытке загрузить 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);

Примечание.

Если вы вызываете 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();

Примечание.

Если схема XSD для вашего DataSet включает целевое пространство имен, данные могут не считываться, и при вызове ReadXml для загрузки DataSet с XML, содержащим элементы без квалифицирующего пространства имен. Чтобы прочитать неквалифицированные элементы в этом случае, задайте elementFormDefault для схемы XSD значение "квалифицировано". Например:

<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 в существующий DataSetDataSet. Обратите внимание, что загрузка DiffGram с использованием ReadXML с XmlReadModeDiffGram приведет к объединению строк, имеющих одинаковый уникальный идентификатор.

См. также