Megosztás a következőn keresztül:


XML-adatok szerializálásának meghatározása

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Ha a xml adattípust explicit módon vagy implicit módon SQL-sztringre vagy bináris típusra öntötte, a xml adattípus tartalma a jelen cikkben ismertetett szabályok szerint lesz szerializálva.

Szerializálás kódolása

Ha az SQL-cél típusa VARBINARY, az eredmény UTF-16-kódolással lesz szerializálva, az elején egy UTF-16 bájtsorrend jellel, de XML-deklaráció nélkül. Ha a céltípus túl kicsi, hibaüzenet jelenik meg.

Például:

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

Ez az eredmény:

0xFFFE3C0094032F003E00

Ha az SQL-cél típusa NVARCHAR vagy NCHAR, az eredmény az UTF-16 formátumban készül, elöl bájtsorrend jel nélkül és XML-deklaráció nélkül. Ha a céltípus túl kicsi, hibaüzenet jelenik meg.

Például:

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

Ez az eredmény:

<Δ/>

Ha az SQL-cél típusa VARCHAR vagy CHAR, az eredmény szerializálva lesz az adatbázis rendezési kódlapjának megfelelő kódolásban bájtsorrendjel vagy XML-deklaráció nélkül. Ha a céltípus túl kicsi, vagy az érték nem rendelhető le a célütközési kódlapra, hiba lép fel.

Például:

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

Ez hibát okozhat, ha az aktuális rendezés kódlapja nem tudja megjeleníteni a Unicode Δ karaktert, vagy az adott kódolásban jeleníti meg.

Amikor XML-eredményeket ad vissza az ügyféloldalnak, az adatok UTF-16 kódolással lesznek elküldve. Az ügyféloldali szolgáltató ezután az API-szabályainak megfelelően teszi elérhetővé az adatokat.

Az XML-struktúrák szerializálása

Az xml adattípus tartalma a szokásos módon szerializálva van. Az elemcsomópontok az elemek jelölésére, a szövegcsomópontok pedig a szöveges tartalomra vannak leképezve. A karakterek entitásként való kezelésének és a típussal rendelkező atomértékek szerializálásának körülményeit azonban a következő szakaszok ismertetik.

XML-karakterek entitása a szerializálás során

Minden szerializált XML-struktúrának képesnek kell lennie az újraelemzésre. Ezért egyes karaktereket entitizált formában kell szerializálni, hogy megőrizzék az oda-vissza képességet az XML-elemző normalizálási fázisán keresztül. Egyes karaktereket azonban entitásoknak kell lenniük ahhoz, hogy a dokumentum jól formázható legyen, és így elemezhető legyen. A szerializálás során alkalmazott entitásokra vonatkozó szabályok a következők:

  • A &, <és > karakterek mindig &amp;, &lt;és &gt; entitizálva vannak, ha attribútumértékben vagy elemtartalomban fordulnak elő.

  • Mivel az SQL Server idézőjelet (U+0022) használ az attribútumértékek bekerítésére, az attribútumértékek idézőjele entitássá alakul &quot;-ként.

  • A helyettesítő pár csak a kiszolgálón történő átalakításkor jelenik meg egyetlen numerikus karakterhivatkozásként. A például megadott U+D800 U+DF00 karakterkód pár a &#x00010300;numerikus karakterhivatkozássá van alakítva.

  • Ha meg szeretné védeni a TAB (U+0009) és a sorfeed (LF, U+000A) normalizálását az elemzés során, az attribútumértékeken belül entitások lesznek &#x9; és &#xA; numerikus karakterhivatkozásaikhoz.

  • Annak érdekében, hogy a kocsivisszavétel (CR, U+000D) ne normalizálódjon az elemzés során, az entitások a numerikus karakterhivatkozásra vannak állítva, &#xD; attribútumértékeken és elemtartalmakon belül.

  • A kizárólag fehér teret tartalmazó szövegcsomópontok védelme érdekében az egyik, általában az utolsó, fehér tér karakter numerikus karakterhivatkozásként van megadva. Ily módon az újraelemzés megőrzi a szóközökkel kapcsolatos szövegcsomópontot, függetlenül attól, hogy az elemzés során hogyan van beállítva a fehér terület kezelése.

Például:

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

Ez az eredmény:

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

Ha nem szeretné alkalmazni az utolsó térközvédelmi szabályt, használhatja az explicit CONVERT 1 opciót, amikor xml-t sztringgé vagy bináris típusra alakítja. Az entitások elkerülése érdekében például a következőket teheti:

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

Az query() metódus (xml adattípus) egy xml adattípus-példányt eredményez. Ezért a sztring vagy bináris típusra átalakított query() metódus bármely eredménye a korábban leírt szabályok szerint lesz entizálva. Ha nem entitásként megadott sztringértékeket szeretne lekérni, használja inkább az érték() metódust (xml-adattípus). Az alábbi példa a query() metódus használatára mutat be példát:

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

Ez az eredmény:

This example contains an entitized char: .

Az alábbi példa a value() metódus használatára mutat be példát:

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

Ez az eredmény:

This example contains an entitized char: .

Beírt XML-adattípus szerializálása

A beírt xml- adattípus-példány olyan értékeket tartalmaz, amelyek az XML-sématípusaik szerint vannak begépelve. Ezek az értékek az XML-sématípusuk szerint szerializálva vannak az XQuery xs:string által előállított formátumával megegyező formátumban. További információkért lásd: Típusbeosztási szabályok az XQuery-ben.

Például az xs:double érték 1.34e1 szerializálva van 13,4-re az alábbi példában látható módon:

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

Ez a 13.4 sztringértéket adja vissza.

Lásd még: