Определение сериализации XML-данных
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure
При приведение типа xml-данных явно или неявно к строке SQL или двоичному типу содержимое xml-типа данных будет сериализовано в соответствии с правилами, описанными в этой статье.
Кодировка сериализации
Если целевой тип данных — VARBINARY, результат сериализуется в UTF-16 с отметкой порядка байтов UTF-16 в начале, но без XML-декларации. Если целевой тип слишком мал, возникает ошибка.
Например:
select CAST(CAST(N'<Δ/>' as XML) as VARBINARY(MAX))
Результат:
0xFFFE3C0094032F003E00
Если целевой тип данных — NVARCHAR или NCHAR, результат сериализуется в UTF-16 без отметки порядка байтов UTF-16 в начале и без XML-декларации. Если целевой тип слишком мал, возникает ошибка.
Например:
select CAST(CAST(N'<Δ/>' as XML) as NVARCHAR(MAX))
Результат:
<Δ/>
Если целевой тип данных — VARCHAR или CHAR, результат сериализуется в кодировке, соответствующей кодовой странице параметров сортировки базы данных без отметки порядка байтов и XML-декларации. Если целевой тип слишком мал или значение не может быть сопоставлено с кодовой страницей целевой сортировки, возникает ошибка.
Например:
select CAST(CAST(N'<Δ/>' as XML) as VARCHAR(MAX))
Это может привести к ошибке, если кодовая страница текущей сортировки не может представлять символ Юникода FX, или он будет представлять его в определенной кодировке.
При возврате XML-результатов клиенту данные будут отправлены в кодировке UTF-16. Поставщик с клиентской стороны, в свою очередь, представит данные в соответствии с правилами своего API.
Сериализация структур XML
Содержимое типа данных xml сериализуется обычным образом. То есть узлы элементов сопоставляются разметке элементов, а текстовые узлы сопоставляются текстовому содержимому. При этом условия, в соответствии с которыми символы преобразуются в сущности, и способы сериализации типизированных атомарных значений описаны в последующих разделах.
Entitization XML-символов во время сериализации
Для каждой сериализованной XML-структуры должна быть возможность повторного синтаксического анализа. Поэтому некоторые символы сериализуются в виде сущностей, что позволяет избежать их искажения на стадии нормализации средства анализа XML. Тем не менее чтобы документ стал корректным и мог быть произведен его синтаксический анализ, некоторые символы должны быть преобразованы в сущности. Ниже приведены правила преобразования в сущности, применяемые в процессе сериализации.
Символы &, <и > всегда идентицируются
&
в ,<
и>
соответственно, если они происходят внутри значения атрибута или содержимого элемента.Так как значения атрибутов в SQL Server заключаются в кавычки (U+0022), знак кавычки в значениях атрибутов преобразуется в сущность
"
.Суррогатная пара преобразуется в цифровую ссылку (только при приведении на сервере). Например, суррогатная пара U+D800 U+DF00 является инициализацией в числовой ссылке
𐌀
на символьные символы.Для защиты табуляции (U+0009) и канала строк (LF, U+000A) от нормализации во время синтаксического анализа они идентифицируются к числовым ссылкам
	
на символы и

соответственно внутри значений атрибутов.Чтобы предотвратить нормализацию возврата каретки (CR, U+000D) во время синтаксического анализа, она задается в его числовую ссылку на символьные символы как внутри значений атрибутов,

так и содержимого элемента.Чтобы защитить текстовые узлы, не содержащие ничего кроме пробелов, один из них, обычно последний, преобразуется к сущности по числовой ссылке. Таким образом, повторный синтаксический анализ сохраняет текстовый узел с пробелами, независимо от установки параметров обработки пробелов во время синтаксического разбора.
Например:
DECLARE @u NVARCHAR(50)
set @u = N'<a a="
'+NCHAR(0xD800)+NCHAR(0xDF00)+N'>"> '+NCHAR(0xA)+N'</a>'
SELECT CAST(CONVERT(XML,@u,1) as NVARCHAR(50));
Результат:
<a a="
𐌀>">
</a>
Если вы не хотите применять последнее правило защиты пробелов, можно использовать явный параметр CONVERT 1 при приведение из XML в строку или двоичный тип. Например, избежать преобразования сущностей можно следующим образом:
SELECT CONVERT(NVARCHAR(50), CONVERT(XML, '<a> </a>', 1), 1);
Метод query() (тип данных XML) приводит к экземпляру типа данных XML . Таким образом, любой query()
результат метода, приведения к строке или двоичному типу, задается в соответствии с ранее описанными правилами. Если вы хотите получить строковые значения, которые не идентицированы, вместо этого следует использовать метод value() (тип данных XML). Ниже приведен пример использования query()
метода:
DECLARE @x xml
SET @x = N'<a>This example contains an entitized char: .</a>'
SELECT @x.query('/a/text()');
Результат:
This example contains an entitized char: .
Ниже приведен пример использования value()
метода:
SELECT @x.value('(/a/text())[1]', 'nvarchar(100)');
Результат:
This example contains an entitized char: .
Сериализация типизированного типа данных XML
Экземпляр типизированных XML -данных содержит значения, типизированные согласно своему типу XML-схемы. Эти значения сериализуются в соответствии с типом XML-схемы в том же формате, какой получается в результате приведения к типу xs:string в XQuery. Дополнительные сведения см. в разделе Правила приведения типов в запросах XQuery.
Например, значение 1.34e1 типа xs:double сериализуется в значение 13.4, как показано в следующем примере:
declare @x xml
set @x =''
select CAST(@x.query('1.34e1') as nvarchar(50));
Возвращается строковое значение 13.4.