Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Содержимое объекта 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, данные не загружаются. |
| 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 приведет к объединению строк, имеющих одинаковый уникальный идентификатор.