Интеграция XML с реляционными данными и ADO.NET
Класс XmlDataDocument является производным от класса XmlDocument и содержит XML-данные. Класс XmlDataDocument организует мост между реляционными и иерархическими данными. Это класс XmlDocument, который можно привязать к объекту DataSet, и оба класса могут синхронизировать изменения, вносимые в данные, которые содержатся в двух классах. Класс XmlDocument, привязанный к объекту DataSet, позволяет интегрировать XML-данные с реляционными данными, без необходимости представлять данные в формате XML или реляционном формате. Можно использовать оба формата, не ограничиваясь единым способом представления данных.
Доступность двух представлений данных дает следующие преимущества.
Структурированную часть XML-документа можно сопоставить с набором данных и эффективным образом хранить, индексировать и использовать в поиске.
В XML-данных, хранимых в реляционном формате, можно эффективно выполнять преобразования, проверку и навигацию с помощью модели курсора. Иногда в реляционных структурах эти операции выполняются более эффективно, чем для XML-данных, хранящихся в модели XmlDocument.
Объект DataSet может хранить часть XML-документа. Это значит, что с помощью XPath или XslTransform можно сохранять в объекте DataSet только нужные элементы и атрибуты. Это позволяет вносить изменения в отфильтрованное подмножество данных меньшего размера, а затем передать изменения в более крупный набор данных в класс XmlDataDocument.
Также можно выполнить преобразование данных, загруженных в объект DataSet из SQL Server. Другой возможностью является привязка элементов управления WinForm и WebForm, управляемых классами платформы .NET Framework, к объекту DataSet, который заполняется из потока входных XML-данных.
Помимо поддержки класса XslTransform, класс XmlDataDocument обеспечивает доступ к реляционным данным для запросов XPath и проверки. Для реляционных данных, в основном, доступны все XML-службы, а реляционные средства, такие как привязка элементов управления, CodeGen и т. д., доступны с помощью структурированной проекции XML-данных без нарушения их точности.
Поскольку класс XmlDataDocument наследует от класса XmlDocument, он содержит реализацию модели W3C DOM. Тот факт, что класс XmlDataDocument связан с объектом DataSet и хранит в нем часть своих данных, ни в коей мере не ограничивает и не затрагивает его использование в качестве класса XmlDocument. Код, написанный для обработки событий класса XmlDocument, работает с классом XmlDataDocument без изменений. Объект DataSet обеспечивает реляционное представление тех же данных, определяя таблицы, столбцы, связи и ограничения, и является изолированным хранилищем пользовательских данных в памяти.
На следующем рисунке показаны различные ассоциации между XML-данными, объектом DataSet и классом XmlDataDocument.
На рисунке показано, как XML-данные могут загружаться непосредственно в объект DataSet, что позволяет работать с ними реляционным образом. XML-данные также можно загрузить в производный класс модели DOM — XmlDataDocument, — а затем загрузить в объект DataSet и синхронизировать. Поскольку объект DataSet и класс XmlDataDocument синхронизируются по одному набору данных, то изменения, вносимые в данные в одном хранилище, отражаются в другом хранилище.
Класс XmlDataDocument наследует все функции изменения и навигации из класса XmlDocument. Бывают случаи, когда использование класса XmlDataDocument с его наследуемыми функциями и синхронизация с объектом DataSet оказываются более предпочтительным вариантом, чем загрузка XML-данных непосредственно в объект DataSet. В следующей таблице показаны аспекты, которые нужно учитывать при выборе метода загрузки в объект DataSet.
Причины для загрузки XML-данных непосредственно в объект DataSet |
Причины для синхронизации класса XmlDataDocument с объектом DataSet |
---|---|
Запросы к данным в объекте DataSet в SQL организуются проще, чем в XPath. |
Необходимо использовать запросы XPath к данным в объекте DataSet. |
Не обязательно сохранять порядок элементов в исходном XML-коде. |
Важно сохранять порядок элементов в исходном XML-коде. |
Не нужно сохранять пробелы между элементами и форматированием в исходном XML-коде. |
Важно сохранять пробелы и форматирование в исходном XML-коде. |
Если непосредственная загрузка XML-данных в объект DataSet и непосредственная запись оттуда соответствует поставленным задачам, см. подразделы Загрузка DataSet из XML и Запись DataSet в виде XML.
Если нужно загружать в объект DataSet из класса XmlDataDocument, см. подраздел Синхронизация объекта DataSet с XML-документом.