Udostępnij za pośrednictwem


Serialization of XML Data

Gdy rzutowanie jawnie lub niejawnie typu danych xml do Typ binarny lub ciąg SQL, zawartości tego typu danych xml będą wykonywane szeregowo zgodnie z regułami określonymi w tym temacie.

Szeregowanie kodowania

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

Na przykład:

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

Oto wynik:

0xFFFE3C0094032F003E00

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

Na przykład:

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

Oto wynik:

<Δ/>

Jeśli SQL typ miejsce docelowe jest VARCHAR lub NCHAR, wynik jest seryjny w metodę kodowania, która odpowiada stronie kodowej 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że być mapowane do strona kodowa sortowanie miejsce docelowe, błąd zostanie zaokrąglona.

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ów Unicode lub będzie reprezentował, przy użyciu określonego kodowania.

Jeżeli zwraca wyniki XML po stronie klient, dane zostaną wysłane w formacie UTF-16 kodowania.dostawca po stronie klient będzie następnie narazić dane zgodnie z przepisami interfejsu API.

Szeregowanie struktury XML

Zawartość XML typ danych jest seryjny w zwykły sposób.W szczególności węzły elementu są mapowane do elementu adiustacji, a tekst węzły są mapowane do zawartości tekstowej.Jednak okoliczności, w jakie znaki są entitized i w jaki sposób pismo niepodzielny wartości są szeregowane są opisane w następnych sekcjach.

Entitization znaki XML podczas serializacji

Każdy serializowane struktury XML powinny być w stanie ich reparsed.W związku z tym niektóre znaki mają być szeregowane w entitized sposobem zachowania błądzenia możliwości znaków za pomocą analizatora składni XML normalizacji fazy.Jednakże niektóre znaki muszą entitized, dzięki czemu dokument jest dobrze sformułowany i, w związku z tym stanie można dokonać analizy.Reguły stosowane podczas serializacji entitization są następujące:

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

  • Ponieważ używa programu SQL Server, a oferty 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 Rzutowanie na serwerze tylko wtedy, gdy.Na przykład para zastępcza U + D800 U + DF00 jest entitized na odwołanie do znaku numerycznego &# x 00010300;.

  • Ochrona TAB (U + 0009) i wysuwu wiersza (LF, 000A U +) z ich znormalizowane podczas analizowania, są entitized do odwołań do znaku numerycznego &# x 9; i &#xA; odpowiednio wewnątrz wartości atrybut.

  • Aby zapobiec sytuacji, w której znak powrotu karetki (CR, U + D 000) są znormalizowane w trakcie analizy, jest entitized do jego odwołanie do znaku numerycznego &#xD; wewnątrz atrybut obie wartości i zawartości elementu.

  • Aby chronić tekst węzłów, które zawierają tylko światło, jeden ze znaków białe miejsca (na ogół ostatnia z nich, jest entitized jako jej odwołanie do znaku numerycznego.W ten sposób reparsing zachowuje węzła tekstu białe miejsca, 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))

Oto wynik:

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

Jeśli nie chcesz zastosować regułę ochrony białe miejsca ostatniej, można użyć jawne opcja CONVERT 1 gdy rzutowanie z XML ciąg lub Typ binarny.Na przykład aby uniknąć entitization, użytkownik może wykonaj następujące czynności:

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

Należy zauważyć, że, Query() metoda (typ danych xml) skutkuje danych xml, wpisz wystąpienie.Dlatego też wyniki Query() metoda, która jest rzutować na ciąg znaków lub Typ binarny jest entitized zgodnie z regułami wcześniejszymi uwagami.Jeśli użytkownik chce uzyskać wartości ciągów, które nie są entitized, należy użyć Value() metoda (typ danych xml) zamiast niego.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()')

Oto wynik:

This example contains an entitized char: &lt;.

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

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

Oto wynik:

This example contains an entitized char: <.

Szeregowania danych xml Typed typ danych

Maszynowy 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 tym samym formacie, co daje XQuery, rzutować xs:ciąg.Aby uzyskać więcej informacji zobaczTyp rzutowania reguły powodujące XQuery.

Na przykład 1.34e1 wartość xs:double jest seryjny 13.4, jak pokazano w poniższym przykładzie:

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

Powoduje to zwrócenie wartości ciąg 13.4.