解析包含处理指令的 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 规范 (https://www.w3.org/TR/xml11/#sec-white-space):
以下示例使用 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