Änderungen am XML-Verhalten beim Parsen und Emittieren (Ausstehend)¶
Achtung
Diese Verhaltensänderung ist in Bundle 2025_01 enthalten.
Den aktuellen Status des Bundles finden Sie unter Bundle-Verlauf.
Wenn dieses Verhaltensänderungs-Bundle aktiviert ist, ändert sich das Parsen und Emittieren von XML-Inhalten bei der Verwendung des Befehls COPY INTO <Tabelle> mit dem XML-Dateiformat und beim Aufruf der folgenden Funktionen:
- Vor der Änderung:
XML-Verhalten beim Parsen und Emittieren:
Einige Abfragen, welche die Funktion CHECK_XML aufrufen, geben eine Zeichenfolge mit einer Fehlermeldung zurück.
Einige Abfragen, welche die Funktion PARSE_XML aufrufen, schlagen fehl.
- Nach der Änderung:
XML-Verhalten beim Parsen und Emittieren:
Einige Abfragen, die vor der Änderung beim Aufruf der Funktion CHECK_XML eine Zeichenfolge mit einer Fehlermeldung zurückgaben, geben nun NULL zurück.
Einige Abfragen, die beim Aufruf der Funktion PARSE_XML vor der Änderung fehlgeschlagen sind, sind jetzt erfolgreich, und die Funktion gibt das geparste XML zurück.
Abfragen mit XML-Zeichenfolgen, die spitze Klammern oder Apostrophe enthalten, liefern nach der Änderung andere Ergebnisse.
Abfragen mit XML-Zeichenfolgen, die Leerzeichen enthalten, oder XML-Attribute, die sich auf die Erhaltung von Leerzeichen beziehen, liefern nach der Änderung andere Ergebnisse.
In den folgenden Abschnitten finden Sie weitere Einzelheiten zu den Änderungen.
Parsen von XML-Inhalt, der Verarbeitungsanweisungen enthält¶
Das folgende Beispiel verwendet die Funktion PARSE_XML, um XML-Inhalt mit Fragezeichen in den Verarbeitungsanweisungen zu parsen:
SELECT PARSE_XML('<?PITarget PIContent ??><mytag />') AS mytag;
- Vor der Änderung zurückgegeben::
100100 (22P02): Error parsing XML: prematurely terminated XML document in processing instructions, pos 33
- Nach der Änderung zurückgegeben::
+-----------------+ | MYTAG | |-----------------| | <mytag></mytag> | +-----------------+
Parsen von XML-Inhalten, die spitze Klammern oder Apostrophe enthalten¶
Im folgenden Beispiel wird die Funktion PARSE_XML verwendet, um XML-Inhalt zu parsen, der spitze Klammern und Apostrophe in XML-Attributwerten enthält. Nach der Änderung werden Apostrophe und spitze Klammern in den XML-Attributwerten im Rückgabewert und im emittierten XML korrekt mit Escape-Zeichen versehen:
SELECT PARSE_XML('<mytag myattr="<>\'"/>') AS mytag;
- Vor der Änderung zurückgegeben::
+------------------------------+ | MYTAG | |------------------------------| | <mytag myattr="<>'"></mytag> | +------------------------------+
- Nach der Änderung zurückgegeben::
+-----------------------------------------+ | MYTAG | |-----------------------------------------| | <mytag myattr="<>'"></mytag> | +-----------------------------------------+
Parsen von XML-Inhalt, der benutzerdefinierte Entitäten enthält¶
Das folgende Beispiel verwendet die Funktion PARSE_XML zum Parsen von XML-Inhalt, der benutzerdefinierte Entitäten enthält:
SELECT PARSE_XML('<!DOCTYPE doc [<!ENTITY placeholder "some text">]><doc>&placeholder;</doc>')
AS placeholder;
- Vor der Änderung zurückgegeben::
100100 (22P02): Error parsing XML: unknown entity &placeholder;, pos 68
- Nach der Änderung zurückgegeben::
+-------------------------------------------------------------+ | PLACEHOLDER | |-------------------------------------------------------------| | <!DOCTYPE doc [<!ENTITY placeholder "some | | text">]><doc>some text</doc> | +-------------------------------------------------------------+
Parsen von XML-Inhalt, der Leerzeichen bewahrt¶
Diese Änderung wurde vorgenommen, damit das Verhalten in Snowflake mit der XML-Spezifikation hinsichtlich der Erhaltung von Leerzeichen übereinstimmt:
Vor der Änderung bleiben Leerzeichen für das Attribut
xsl:space="preserve"
erhalten. Nach der Änderung bleiben Leerzeichen für das Attributxsl:space="preserve"
nicht erhalten.Vor der Änderung wurden für das Attribut
xml:space="preserve"
keine Leerzeichen beibehalten. Nach der Änderung bleiben Leerzeichen für das Attributxml:space="preserve"
erhalten.
Das folgende Beispiel verwendet die Funktion PARSE_XML, um den XML-Inhalt zu parsen, und gibt das Attribut xsl:space="preserve"
an:
SELECT PARSE_XML('<mytag xsl:space="preserve"> my content </mytag>')
AS space_preserve;
- Vor der Änderung zurückgegeben::
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xsl:space="preserve"> my content </mytag> | +--------------------------------------------------+
- Nach der Änderung zurückgegeben::
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xsl:space="preserve">my content</mytag> | +--------------------------------------------------+
Das folgende Beispiel verwendet die Funktion PARSE_XML, um den XML-Inhalt zu parsen, und gibt das Attribut xml:space="preserve"
an:
SELECT PARSE_XML('<mytag xml:space="preserve"> my content </mytag>')
AS space_preserve;
- Vor der Änderung zurückgegeben::
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xml:space="preserve">my content</mytag> | +--------------------------------------------------+
- Nach der Änderung zurückgegeben::
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xml:space="preserve"> my content </mytag> | +--------------------------------------------------+
Laden von XML-Inhalt, der Leerzeichen bewahrt¶
Im folgenden Beispiel werden mit dem Befehl COPY INTO <table> Daten in eine Tabelle geladen. Der Parameter PRESERVE_SPACE ist auf TRUE eingestellt, um Leerzeichen zu bewahren:
COPY INTO mytable
FROM @my_xml_stage
FILE_FORMAT = (TYPE = 'XML' PRESERVE_SPACE = TRUE);
- Geladener Inhalt vor der Änderung::
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xsl:space="preserve"> my content </mytag> | +--------------------------------------------------+
- Geladener Inhalt nach der Änderung::
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xml:space="preserve"> my content </mytag> | +--------------------------------------------------+
Vor und nach der Änderung behält der Inhalt Leerzeichen bei, aber das Attribut ändert sich von xsl:space="preserve"
zu xml:space="preserve"
.
Ref: 1862