XML の解析と出力の動作の変更(保留中)¶
この動作変更バンドルが有効な場合、 XML ファイル形式で COPY INTO <テーブル> コマンドを使用する際に、以下の関数を呼び出すと XML コンテンツの解析と出力が変更されます。
- 変更前:
XML 解析と出力の動作:
CHECK_XML 関数を呼び出すクエリの中には、エラーメッセージを文字列で返すものがあります。
PARSE_XML 関数を呼び出す一部のクエリは失敗します。
- 変更後:
XML 解析と出力の動作:
変更前は、 CHECK_XML 関数を呼び出すとエラーメッセージとともに文字列を返していたクエリも現在は NULL を返すようになりました。
変更前は、 PARSE_XML 関数を呼び出すと失敗していたクエリも成功するようになり、関数は解析された XML を返します。
角括弧またはアポストロフィを含む XML 文字列を含むクエリは、変更後に異なる結果を返します。
空白を含む XML 文字列、または空白の保持に関連する XML 属性を持つクエリは、変更後に異なる結果を返します。
以下のセクションでは、変更点の詳細を説明します。
処理手順を含む XML コンテンツの解析¶
次の例では、 PARSE_XML 関数を使用して、処理手順に疑問符が含まれる XML コンテンツを解析しています。
SELECT PARSE_XML('<?PITarget PIContent ??><mytag />') AS mytag;
- 変更前に返されたもの::
100100 (22P02): Error parsing XML: prematurely terminated XML document in processing instructions, pos 33
- 変更後に返されるもの::
+-----------------+ | MYTAG | |-----------------| | <mytag></mytag> | +-----------------+
角括弧またはアポストロフィを含む XML コンテンツの解析¶
次の例では、 PARSE_XML 関数を使用して、 XML 属性値に角括弧とアポストロフィが含まれる XML コンテンツを解析しています。変更後、 XML 属性値のアポストロフィや角括弧は、戻り値や生成される XML で適切にエスケープされます。
SELECT PARSE_XML('<mytag myattr="<>\'"/>') AS mytag;
- 変更前に返されたもの::
+------------------------------+ | MYTAG | |------------------------------| | <mytag myattr="<>'"></mytag> | +------------------------------+
- 変更後に返されるもの::
+-----------------------------------------+ | MYTAG | |-----------------------------------------| | <mytag myattr="<>'"></mytag> | +-----------------------------------------+
ユーザー定義のエンティティを含む XML コンテンツの解析¶
次の例では、 PARSE_XML 関数を使用して、ユーザー定義エンティティを含む XML コンテンツを解析します。
SELECT PARSE_XML('<!DOCTYPE doc [<!ENTITY placeholder "some text">]><doc>&placeholder;</doc>')
AS placeholder;
- 変更前に返されたもの::
100100 (22P02): Error parsing XML: unknown entity &placeholder;, pos 68
- 変更後に返されるもの::
+-------------------------------------------------------------+ | PLACEHOLDER | |-------------------------------------------------------------| | <!DOCTYPE doc [<!ENTITY placeholder "some | | text">]><doc>some text</doc> | +-------------------------------------------------------------+
空白を保持する XML コンテンツの解析¶
この変更は、Snowflakeの動作が、空白の保持に関する XML 仕様 と一致するように行われました。
変更前は、
xsl:space="preserve"
属性に対して空白が保持されます。変更後、xsl:space="preserve"
属性では空白は保持されません。変更前は、
xml:space="preserve"
属性では空白は保持されませんでした。変更後、xml:space="preserve"
属性では空白が保持されます。
次の例では、 PARSE_XML 関数を使用して XML コンテンツを解析し、 xsl:space="preserve"
属性を指定しています。
SELECT PARSE_XML('<mytag xsl:space="preserve"> my content </mytag>')
AS space_preserve;
- 変更前に返されたもの::
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xsl:space="preserve"> my content </mytag> | +--------------------------------------------------+
- 変更後に返されるもの::
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xsl:space="preserve">my content</mytag> | +--------------------------------------------------+
次の例では、 PARSE_XML 関数を使用して XML コンテンツを解析し、 xml:space="preserve"
属性を指定しています。
SELECT PARSE_XML('<mytag xml:space="preserve"> my content </mytag>')
AS space_preserve;
- 変更前に返されたもの::
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xml:space="preserve">my content</mytag> | +--------------------------------------------------+
- 変更後に返されるもの::
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xml:space="preserve"> my content </mytag> | +--------------------------------------------------+
XML 空白を保持するコンテンツのロード¶
以下の例では、 COPY INTO <table> コマンドを使用して、データのロードを行っています。PRESERVE_SPACE パラメーターは、空白を保持するために TRUE に設定されます。
COPY INTO mytable
FROM @my_xml_stage
FILE_FORMAT = (TYPE = 'XML' PRESERVE_SPACE = TRUE);
- 変更前にコンテンツがロードされました。:
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xsl:space="preserve"> my content </mytag> | +--------------------------------------------------+
- 変更後にコンテンツがロードされました。:
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xml:space="preserve"> my content </mytag> | +--------------------------------------------------+
変更の前後で、コンテンツは空白を保持しますが、属性は xsl:space="preserve"
から xml:space="preserve"
に変更されます。
参照: 1862