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

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

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

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

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

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

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

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

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

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

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

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

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

Примечание.

Если вы передаете 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);  

Примечание.

При вызове 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 приложения содержит целевое пространствоName, данные могут не считываться, и при вызове ReadXml для загрузки DataSet XML-файла, содержащего элементы без соответствующего пространства имен. Чтобы прочитать неквалифицированные элементы в этом случае, задайте элементFormDefault равным "квалифицированным" в схеме 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 для создания нового, а затем Merge нового DataSetDataSet в существующийDataSet. Обратите внимание, что загрузка DiffGram с помощью ReadXML с XmlReadMode DiffGram объединяет строки с одинаковым уникальным идентификатором.

См. также