Definieren der Serialisierung von XML-Daten

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Beim expliziten oder impliziten Umwandeln des XML-Datentyps in eine SQL-Zeichenfolge oder einen binären Typ wird der Inhalt des XML-Datentyps gemäß den in diesem Artikel beschriebenen Regeln serialisiert.

Serialisierungscodierung

Wenn der SQL-Zieltyp VARBINARY ist, erfolgt die Serialisierung des Ergebnisses in UTF-16 mit einer UTF-16-Markierung für die Bytereihenfolge am Anfang, jedoch ohne eine XML-Deklaration. Wenn der Zieltyp zu klein ist, wird ein Fehler ausgelöst.

Beispiel:

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

Dies ist das Ergebnis:

0xFFFE3C0094032F003E00

Wenn der SQL-Zieltyp NVARCHAR oder NCHAR ist, erfolgt die Serialisierung des Ergebnisses in UTF-16 ohne die Markierung für die Bytereihenfolge am Anfang und ohne eine XML-Deklaration. Wenn der Zieltyp zu klein ist, wird ein Fehler ausgelöst.

Beispiel:

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

Dies ist das Ergebnis:

<Δ/>

Wenn der SQL-Zieltyp VARCHAR oder CHAR ist, erfolgt die Serialisierung des Ergebnisses in der Codierung, die der Codepage der Datenbanksortierung entspricht, ohne Markierung zur Bytereihenfolge oder XML-Deklaration. Wenn der Zieltyp zu klein ist oder der Wert nicht der Zielsortierungscodeseite zugeordnet werden kann, wird ein Fehler ausgelöst.

Beispiel:

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

Dies kann zu einem Fehler führen, wenn die Codepage der aktuellen Sortierung das Unicode-Zeichen Δ nicht darstellen kann oder sie in der spezifischen Codierung darstellt.

Beim Zurückgeben der XML-Ergebnisse an die Clientseite werden die Daten in UTF-16-Codierung gesendet. Der clientseitige Anbieter macht die Daten dann entsprechend seinen API-Regeln verfügbar.

Serialisierung der XML-Strukturen

Der Inhalt eines xml -Datentyps wird auf die herkömmliche Art und Weise serialisiert. Das heißt konkret, dass Elementknoten dem Elementmarkup zugeordnet und Textknoten dem Textinhalt zugeordnet werden. Die Umstände, unter denen die Zeichen in Entitäten geändert werden, und die Modalitäten beim Serialisieren von atomaren Werten werden in den folgenden Abschnitten beschrieben.

Entitisierung von XML-Zeichen während der Serialisierung

Jede serialisierte XML-Struktur muss in der Lage sein, neu analysiert zu werden. Deshalb müssen einige Zeichen so serialisiert werden, dass sie in eine Entität geändert werden, damit die Roundtripfähigkeit der Zeichen in der gesamten Normalisierungsphase des XML-Parsers erhalten bleibt. Allerdings müssen einige Zeichen so in Entitäten geändert werden, dass das Dokument wohlgeformt ist und somit analysiert werden kann. Im Folgenden sind die bei der Serialisierung geltenden Regeln für das Ändern in Entitäten aufgeführt:

  • Die Zeichen &, <und > werden immer zu &amp;, &lt;bzw &gt; . wenn sie innerhalb eines Attributwerts oder Elementinhalts auftreten.

  • Da SQL Server ein Anführungszeichen (U+0022) zum Einschließen von Attributwerten verwendet, wird das Anführungszeichen in Attributwerten bei der Änderung in Entitäten zu &quot;.

  • Ein Ersatzpaar wird beim Ändern in Entitäten zu einem einzelnen numerischen Zeichenverweis, wenn die Umwandlung nur auf dem Server erfolgt. Beispielsweise wird das Ersatzpaar U+D800 U+DF00 zum numerischen Zeichenverweis &#x00010300;entitisiert.

  • Um die Normalisierung einer TAB-Taste (U+0009) und eines Zeilenvorschubs (LF, U+000A) während der Analyse zu schützen, werden sie an ihre numerischen Zeichenverweise &#x9; und &#xA; jeweils innerhalb von Attributwerten angepasst.

  • Um zu verhindern, dass ein Wagenrücklauf (CR, U+000D) während der Analyse normalisiert wird, wird er in seinen numerischen Zeichenbezug &#xD; innerhalb von Attributwerten und Elementinhalten entitiert.

  • Um Textknoten zu schützen, die ausschließlich Leerzeichen enthalten, wird eines der Leerzeichen – zumeist das letzte – beim Ändern in Entitäten zu dessen numerischem Zeichenverweis. Auf diese Weise bleibt der Leerzeichentextknoten beim Neuanalysieren erhalten, und zwar unabhängig von der Einstellung zur Handhabung von Leerzeichen beim Analysieren.

Beispiel:

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

Dies ist das Ergebnis:

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

Wenn Sie die letzte Leerraumschutzregel nicht anwenden möchten, können Sie beim Umwandeln von XML in eine Zeichenfolge oder einen Binärtyp die explizite CONVERT-Option 1 verwenden. Sie können z. B. folgende Aktionen ausführen, um das Ändern in Entitäten zu vermeiden:

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

Die Query() -Methode (XML-Datentyp) führt zu einer XML-Datentypinstanz . Daher wird jedes Ergebnis der query() Methode, die in eine Zeichenfolge oder einen binären Typ umgeschrieben wird, gemäß den zuvor beschriebenen Regeln entitisiert. Wenn Sie die Zeichenfolgenwerte abrufen möchten, die nicht initialisiert sind, sollten Sie stattdessen die Value() -Methode (XML-Datentyp) verwenden. Nachfolgend sehen Sie ein Beispiel für die Verwendung der query() Methode:

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

Dies ist das Ergebnis:

This example contains an entitized char: .

Nachfolgend sehen Sie ein Beispiel für die Verwendung der value() Methode:

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

Dies ist das Ergebnis:

This example contains an entitized char: .

Serialisieren eines typierten XML-Datentyps

Eine typisierte xml -Datentypinstanz enthält Werte, die entsprechend ihren XML-Schematypen typisiert sind. Diese Werte werden entsprechend ihrem XML-Schematyp in dasselbe Format serialisiert, wie es bei der XQuery-Umwandlung in xs:string entsteht. Weitere Informationen finden Sie unter Typumwandlungsregeln in XQuery.

So wird z. B. der xs:double-Wert 1.34e1 zu 13.4 serialisiert, wie das im folgenden Beispiel gezeigt wird.

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

Es wird der Zeichenfolgenwert 13.4 zurückgegeben.

Siehe auch