Sdílet prostřednictvím


Definování serializace dat XML

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instance

Při přetypování xml datového typu explicitně nebo implicitně na řetězec NEBO binární typ SQL bude obsah xml datový typ serializován podle pravidel uvedených v tomto článku.

Serializační kódování

Pokud je cílový typ SQL VARBINARY, výsledek je serializován v UTF-16 s použitím značky pořadí bajtů UTF-16 na začátku, ale bez deklarace XML. Pokud je cílový typ příliš malý, vyvolá se chyba.

Například:

select CAST(CAST(N'<Δ/>' as XML) as VARBINARY(MAX))

Toto je výsledek:

0xFFFE3C0094032F003E00

Pokud je cílový typ SQL NVARCHAR nebo NCHAR, je výsledek serializován v UTF-16 bez značky pořadí bajtů před a bez deklarace XML. Pokud je cílový typ příliš malý, vyvolá se chyba.

Například:

select CAST(CAST(N'<Δ/>' as XML) as NVARCHAR(MAX))

Toto je výsledek:

<Δ/>

Pokud je cílový typ SQL VARCHAR nebo CHAR, výsledek se serializuje v kódování, které odpovídá znakové stránce kolace databáze bez značky pořadí bajtů nebo deklarace XML. Typ cíle je příliš malý, nebo pokud se nepodaří namapovat hodnotu na kódovou stránku kolace, vyvolá se chyba.

Například:

select CAST(CAST(N'<Δ/>' as XML) as VARCHAR(MAX))

To může mít za následek chybu, pokud aktuální stránka sady znaků nemůže zobrazit znak Unicode Δ, nebo ho zobrazí v konkrétním kódování.

Při vracení výsledků XML na straně klienta budou data odeslána v kódování UTF-16. Zprostředkovatel na straně klienta pak zveřejní data podle pravidel rozhraní API.

Serializace struktur XML

Obsah datového typu xml je serializován obvyklým způsobem. Konkrétně jsou uzly elementů mapovány na značení elementů a textové uzly jsou mapovány na textový obsah. Okolnosti, za kterých jsou znaky entitizovány a jak jsou typované atomické hodnoty serializovány, jsou popsány v následujících částech.

Entitizace znaků XML během serializace

Každá serializovaná struktura XML by měla být schopna být reparseována. Některé znaky proto musí být serializovány ve formě entit, aby se zachovala schopnost zpětného přenosu znaků prostřednictvím normalizační fáze XML analyzátoru. Některé znaky však musí být entitovány tak, aby byl dokument správně vytvořený, a proto je možné je analyzovat. Následují pravidla entitizace, která se vztahují během serializace:

  • Znaky &, <a > jsou vždy entitovány na &amp;, &lt;a &gt;, pokud se vyskytují uvnitř obsahu atributu nebo prvku.

  • Vzhledem k tomu, že SQL Server používá uvozovky (U+0022) pro uzavření hodnot atributů, uvozovky v hodnotách atributů jsou entitovány jako &quot;.

  • Náhradní dvojice je entitována jako odkaz na jeden číselný znak, pokud je přetypování pouze na serveru. Například náhradní dvojice U+D800 U+DF00 je entitována na odkaz na číselný znak &#x00010300;.

  • Pokud chcete chránit tabulátor (U+0009) a spojnicový kanál (LF, U+000A) před normalizací během analýzy, jsou entitovány na odkazy na číselné znaky &#x9; a &#xA; uvnitř hodnot atributů.

  • Aby se při analýze zabránilo normalizaci návratu na začátek řádku (CR, U+000D), je entitizován na odkaz na číselný znak, &#xD; uvnitř hodnot atributů i obsahu elementu.

  • Chcete-li chránit textové uzly, které obsahují pouze prázdné znaky, jeden z prázdných znaků, obecně poslední, je entitován jako odkaz na číselný znak. Tímto způsobem se při opětovném parsování zachová uzel textu s bílými mezerami, bez ohledu na nastavení zpracování bílých mezer během analýzy.

Například:

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));

Toto je výsledek:

<a a="
    𐌀>">
</a>

Pokud nechcete použít poslední pravidlo ochrany prázdným znakem, můžete při přetypování z xml použít explicitní možnost CONVERT 1 na řetězec nebo binární typ. Pokud se chcete například vyhnout entitizaci, můžete udělat toto:

SELECT CONVERT(NVARCHAR(50), CONVERT(XML, '<a>   </a>', 1), 1);

Metoda query() (datový typ XML) výsledkem instance datového typu xml. Proto jakýkoli výsledek query() metody, která je přetypována na řetězec nebo binární typ, je entitizována podle dříve popsaných pravidel. Pokud chcete získat řetězcové hodnoty, které nejsou entitizované, měli byste místo toho použít metodu value() (datový typ XML). Následuje příklad použití metody query():

DECLARE @x xml
SET @x = N'<a>This example contains an entitized char: .</a>'
SELECT @x.query('/a/text()');

Toto je výsledek:

This example contains an entitized char: .

Následuje příklad použití metody value():

SELECT @x.value('(/a/text())[1]', 'nvarchar(100)');

Toto je výsledek:

This example contains an entitized char: .

Serializace typovaného XML datového typu

Datová instance typu xml obsahuje hodnoty, které jsou zadány podle jejich typů podle schématu XML. Tyto hodnoty jsou serializovány podle svého typu XML schématu ve stejném formátu, jaký vytvoří převod v XQuery na xs:string. Další informace viz pravidla přetypování v XQuery.

Například xs:double hodnota 1.34e1 je serializována na 13.4, jak je znázorněno v následujícím příkladu:

declare @x xml
set @x =''
select CAST(@x.query('1.34e1') as nvarchar(50));

Vrátí hodnotu řetězce 13,4.

Viz také