Определение сериализации 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. Тем не менее чтобы документ стал корректным и мог быть произведен его синтаксический анализ, некоторые символы должны быть преобразованы в сущности. Ниже приведены правила преобразования в сущности, применяемые в процессе сериализации.

  • Символы &, <и > всегда идентицируются &amp;в , &lt;и &gt; соответственно, если они происходят внутри значения атрибута или содержимого элемента.

  • Так как значения атрибутов в SQL Server заключаются в кавычки (U+0022), знак кавычки в значениях атрибутов преобразуется в сущность &quot;.

  • Суррогатная пара преобразуется в цифровую ссылку (только при приведении на сервере). Например, суррогатная пара U+D800 U+DF00 является инициализацией в числовой ссылке &#x00010300;на символьные символы.

  • Для защиты табуляции (U+0009) и канала строк (LF, U+000A) от нормализации во время синтаксического анализа они идентифицируются к числовым ссылкам &#x9; на символы и &#xA; соответственно внутри значений атрибутов.

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

  • Чтобы защитить текстовые узлы, не содержащие ничего кроме пробелов, один из них, обычно последний, преобразуется к сущности по числовой ссылке. Таким образом, повторный синтаксический анализ сохраняет текстовый узел с пробелами, независимо от установки параметров обработки пробелов во время синтаксического разбора.

Например:

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.

См. также