Тип данных XML

Основы

XML-документ или фрагмент представлен в виде нового типа данных – xml. Вы можете создавать атрибуты таблиц или переменные данного типа. Инициализировать их можно просто строкой, например:

declare @xml xmlset @xml = N'<root/>'

XML-тип похож на CLR-тип в том смысле, что у него, как и у CLR-типа, имеются методы. Экземпляр XML-типа создается не в момент объявления, а только тогда, когда ему присваивается некое строковое значение. Например,

declare @xml xml--здесь переменная @xml равна NULL, --поэтому следующий запрос возвращает NULLselect @xml::query('/*')--создаем экземплярset @xml = ''--здесь возвращается пустая строкаselect @xml::query('/*')

XML-тип похож на строковый: единственное ограничение заключается в том, что строка должна представлять сбалансированный XML-фрагмент. Под сбалансированным XML-фрагментом (это не официальный термин, однако он встречается в литературе) понимается XML-фрагмент, который полностью удовлетворяет спецификации XML 1.0 за исключением того, что не имеет корневого элемента. Такой документ нельзя назвать правильно оформленным (well formed), однако в некоторых языках (XPath, XQuery) он допустим.

Переменная строкового типа неявно преобразуется к XML-типу. Обратное не верно: для того, чтобы получить экземпляр XML-типа вам необходимо выполнить явное преобразование с помощью операторов cast или convert.

ПРИМЕЧАНИЕ Документация на эти операторы еще не обновлена, и не отражает того факта, что XML-тип можно преобразовывать в строку. Примечателено, что с помощью convert можно менять кодировку документа (это также не нашло пока отражения в текущей версии документации).

Так как строки неявно преобразуются к типу xml, вы можете задавать умолчания (defaults) для колонок XML-типа в виде строки или менять тип поля таблицы со строкового на xml. Например,

--создаем два поля: x – типа xml, str – типа varcharcreate table T(x xml default('<root/>'), str varchar(100) default('<root/>')) --изменяем тип поля str, на xml.alter table T alter column str xml

В принципе, такое поведение вполне логично. Xml – это прежде всего текст! Давайте рассмотрим, чем же он отличается от обычной строки.

С XML-типом можно связать схему (xml schema), которая предназначена для проверки структуры документа. Документ, соответствующий определенной схеме, называется допустимым (well formed). Схемы данных описываются с помощью специального языка XML Schema definition language (XSD), который в свою очередь также выражается с помощью xml. Спецификация XML Schema принята уже относительно давно, более детальную информацию о ней и официальные документы можно найти в [5].

Создадим простенькую схему для документа, который может содержать только один XML-элемент с названием root, не может содержать атрибутов и дочерних элементов. Значение элемента root ограничено строковым типом. Забегая вперед скажу, что в SQL Server-е название схемы явно не задается, оно получается из целевого имени (targetNamespace) пространства имен схемы данных.

Создается схема с помощью новой инструкции create xmlschema. Вот как это делается:

create xmlschema'<?xml version="1.0" encoding="windows-1251"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="my-first-schema"> <xs:element name="root" type="xs:string"/></xs:schema>'

О работе со схемами в SQL Server я поговорю чуть попозже, а теперь давайте попытаемся создать экземпляр документа этой схемы:

declare @xml xml ('my-first-schema')set @xml = '<root xmlns="my-first-schema" a=""/>'

Так как наличие каких-либо атрибутов запрещено схемой, в момент присваивания строкового литерала переменной @xml, мы получаем ошибку:

XML Validation: Undefined or prohibited attribute specified: 'a'

Переменная XML-типа, которая связана с какой-либо схемой данных, называется типизированной. Вы можете изменять тип (т.е. схему) полей XML-типа с помощью команды alter table, как, например, в следующем примере (таблица T была создана в примере выше):

alter table T alter column x xml('my-first-schema')

Теперь атрибут x таблицы T является типизированным. При попытке вставить в него фрагмент, не соответствующий схеме, будет сгенерированна ошибка. Например команда,

insert into T default values

попытается вставить в него документ <root/> (заданный по умолчанию), который не принадлежит пространству имен my-first-schema, поэтому сервер выдаст ошибку:

XML Validation: Specified element 'root' is not valid at this location

Так как xml – это полноценный тип, у него есть методы:

  • query – позволяет выполнять запросы XQuery.
  • value – выбирает скалярное значение с помощью запроса XQuery.
  • exist – возвращает булево значение, если результат запроса XQuery вернул не пустую последовательность.
  • modify – позволяет изменять содержимое XML-документа.

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: