Загрузка набора данных из 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 объединяет строки с одинаковым уникальным идентификатором.