Udostępnij za pośrednictwem


Szeregowanie danych XML

Gdy rzutowanie typu danych xml jawnie lub niejawnie na ciąg SQL lub Typ binarny, zawartości typu danych xml będą szeregowane zgodnie z regułami opisane w tym temacie.

Serializacja kodowania

Jeśli SQL typ miejsce docelowe jest VARBINARY, wynik jest seryjny w UTF-16 znakiem UTF-16-bajtowy kolejność z przodu, ale bez deklaracja XML.Jeśli typ miejsce docelowe jest za mały, spowodował błąd.

Na przykład:

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

Jest to wynikiem:

0xFFFE3C0094032F003E00

Jeśli SQL typ miejsce docelowe jest NVARCHAR lub NCHAR, wynik jest seryjny w UTF-16 bez znacznika kolejności bajtów z przodu i bez deklaracja XML.Jeśli typ miejsce docelowe jest za mały, spowodował błąd.

Na przykład:

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

Jest to wynikiem:

<Δ/>

Jeśli SQL typ miejsce docelowe jest VARCHAR lub NCHAR, wynik jest seryjny w kodowaniu odpowiada stronie kodu sortowanie bazy danych bez znacznika kolejności bajtów lub deklaracja XML.Jeśli typ miejsce docelowe jest zbyt mała lub wartość nie można mapować do strony docelowej kod sortowanie, spowodował błąd.

Na przykład:

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

Może to spowodować błąd, jeśli sortowanie bieżącej strona kodowa nie może reprezentować Δ znak Unicode lub będzie reprezentował on w określonego kodowania.

Podczas zwracania wyniki XML po stronie klient, dane będą przesyłane w UTF-16 kodowania.Dostawca klient będzie wtedy ujawnić dane zgodnie z jego regułami interfejsu API.

Serializacja struktury XML

Zawartość xml zaszeregować typu danych w zwykły sposób.W szczególności element węzły są mapowane do adiustacji element i węzłów tekstowych są mapowane do zawartości tekstowej.Jednakże są szeregowane okolicznościach znaki są entitized i jak wpisywane wartości niepodzielny są opisane w następnych sekcjach.

Entitization znaki XML podczas serializacji.

Każdy serializowane struktury XML powinny być zdolne do ich reparsed.Niektóre znaki więc szeregowania w entitized sposób zachowania możliwości błądzenia znaków poprzez fazę normalizacji analizatora składni XML.Jednakże niektóre znaki muszą entitized, tak aby dokument jest dobrze sformułowany i dlatego może być analizowany.Reguły stosowane podczas serializacji entitization są następujące:

  • Znaki &, <, i > są zawsze entitized do &amp; &lt; i &BT; odpowiednio wewnątrz zawartości element lub wartość atrybut.

  • Ponieważ program SQL Server używa w ofercie znak (U + 0022) zawierającym wartości atrybut, cudzysłów wartości atrybut jest entitized jako &quot;.

  • Para zastępcza jest entitized jako odwołanie pojedynczy znak numeryczny, gdy rzutowanie tylko na serwerze.Na przykład U + D800 U + DF00 para zastępcza jest entitized do odwołanie do znaku numerycznego &# x 00010300;.

  • Na KARCIE ochrona (U + 0009) i wysuwu wiersza (LF, U + 000A) z są znormalizowane w trakcie analizy, są entitized na ich znaku numerycznego odwołania &# x 9; and &#xA; odpowiednio, wewnątrz wartości atrybut.

  • Aby zapobiec są znormalizowane w trakcie analizy powrót karetki (CR), U + D 000), jest entitized do jej odwołanie do znaku numerycznego &#xD; wewnątrz zarówno atrybut wartości i zawartości elementu.

  • Aby chronić tekst węzłów, które zawierają tylko odstęp, jeden ze znaków spacji ogólnie ostatnią, jest entitized jako jej odwołanie do znaku numerycznego.W ten sposób reparsing zachowuje węzła tekstu spacji, niezależnie od ustawienia odstępu obsługi w trakcie analizy.

Na przykład:

declare @u NVARCHAR(50)
set @u = N'<a a="&#xD;&#x9;'+NCHAR(0xD800)+NCHAR(0xDF00)+N'>">   '+NCHAR(0xA)+N'</a>'
select CAST(CONVERT(XML,@u,1) as NVARCHAR(50))

Jest to wynikiem:

<a a="&#xD;&#x9;&#x00010300;&gt;">   &#xA;</a>

Jeśli nie chcesz zastosować ostatnia reguła ochrony spacji, opcja konwersji jawnej 1 można używać podczas rzutowanie z xml ciąg lub Typ binarny.Na przykład aby uniknąć entitization, można wykonać następujące czynności:

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

Należy zauważyć, że, query() metody (xml typ danych) wystąpienie wpisz wyniki w danych xml.Dlatego wyniki query() metoda rzutować typu binarny lub ciąg jest entitized zgodnie z regułami opisane wcześniej.Jeśli chcesz uzyskać ciąg wartości, które nie są entitized, należy użyć value() metody (xml typ danych) zamiast.Poniżej przedstawiono przykład użycia query() metoda:

declare @x xml
set @x = N'<a>This example contains an entitized char: &lt;.</a>'
select @x.query('/a/text()')

Jest to wynikiem:

This example contains an entitized char: &lt;.

Poniżej przedstawiono przykład użycia value() metoda:

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

Jest to wynikiem:

This example contains an entitized char: <.

Serializacji xml Typed typ danych

Pismo xml wystąpienie typu danych zawiera wartości, które są wpisane zgodnie z ich typy schematów XML.Te wartości są szeregowane zgodnie z typem schematu XML w formacie, co daje XQuery oddanych do xs:ciąg.Aby uzyskać więcej informacji, zobacz Typ rzutowania reguł w XQuery.

Na przykład 1.34e1 wartość xs:double jest seryjny 13.4, jak pokazano w następującym przykładzie:

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

Zwraca wartość ciąg 13.4.