- 类别:
:doc:`/sql-reference/functions-semistructured`(解析)
PARSE_XML¶
将输入字符串解释为 XML 文档,并生成一个 OBJECT 值。如果输入为 NULL,则输出为 NULL。
- 另请参阅:
语法¶
PARSE_XML( <string_containing_xml> [ , <disable_auto_convert> ] )
PARSE_XML( STR => <string_containing_xml>
[ , DISABLE_AUTO_CONVERT => <disable_auto_convert> ] )
实参¶
必填:
string_containing_xml
. OR .STR => string_containing_xml
此表达式的计算结果应为 VARCHAR。VARCHAR 应包含有效的 XML。
可选:
disable_auto_convert
. OR .DISABLE_AUTO_CONVERT => disable_auto_convert
布尔表达式,用于指定函数是否应尝试将
string_containing_xml
中的数值和布尔值转换为 Snowflake 数据类型。(有关此转换的详细信息,请参阅下面的 使用说明。)如果 不 希望函数转换这些值,请将此实参设置为
TRUE
。这样做的效果与 CREATE FILE FORMAT 中的DISABLE_AUTO_CONVERT
参数类似。如果希望函数转换这些值,请将此实参设置为
FALSE
,或省略此实参。
默认:
FALSE
返回¶
返回值的数据类型是 OBJECT。OBJECT 包含 XML 的内部表示形式。
使用说明¶
必须按名称或位置指定所有实参。不能按名称指定某些实参,也不能按位置指定其他实参。
按名称指定实参时,不能在实参名称前后使用双引号。
XML 文档中每个元素的内容都是文本。PARSE_XML 会尝试将某些 XML 数据从文本转换为原生的 (Snowflake SQL) SQL 数据类型参考。
NUMERIC 和 BOOLEAN:
PARSE_XML 会尝试以某种方式将数值和布尔值显式转换为原生表示形式,在这种方式下,将这些值打印回来会产生在文本上相同的结果。例如,在解析十进制数时,PARSE_XML 会将 123.45 视为 NUMBER(5,2) 而不是 DOUBLE,以尝试保持表示形式的准确性。但是:
如果数字使用科学记数法(即 1.2345e+02),或者由于范围或小数位数限制而无法存储为定点小数,它们将存储为 DOUBLE。
如果 XML 元素的内容是包含小数位的数字,则 PARSE_XML 可能会截断尾随零。
如果不希望函数执行此转换,请将
TRUE
作为disable_auto_convert
实参传递。TIMESTAMP、DATE、TIME、BINARY:
因为 XML 未以原生方式表示 TIMESTAMP、DATE、TIME 或 BINARY 等值,所以这些值必须表示为 XML 中的字符串。PARSE_XML 不会自动识别这些值;它们作为字符串保留,因此如果需要,用户必须将这些值从字符串转换为原生的 SQL 数据类型。
XML 属性是名称/值对的 无序 集合。PARSE_XML 函数不一定会保留顺序。例如,如果将文本转换为 XML,然后再转换回文本,可能会产生一个包含顺序有变的原始信息的字符串。
从字符串转换为 XML 时,可能会看到元素之间的空白发生变化。
示例¶
在以下示例中,可以看到如何使用 PARSE_XML 函数将 XML 字符串转换为可插入 OBJECT 列中的 OBJECT :
CREATE TABLE xtab (v OBJECT); INSERT INTO xtab SELECT PARSE_XML(column1) AS v FROM VALUES ('<a/>'), ('<a attr="123">text</a>'), ('<a><b>X</b><b>Y</b></a>'); SELECT * FROM xtab;+-------------------------+ | V | +-------------------------+ | <a></a> | | <a attr="123">text</a> | | <a><b>X</b><b>Y</b></a> | +-------------------------+
以下示例演示了使用和禁用数值转换之间的区别。在此示例中,当未禁用转换时,函数会将采用科学记数法的数字解释为 DOUBLE。
SELECT PARSE_XML('<test>22257e111</test>'), PARSE_XML('<test>22257e111</test>', TRUE);+-------------------------------------+-------------------------------------------+ | PARSE_XML('<TEST>22257E111</TEST>') | PARSE_XML('<TEST>22257E111</TEST>', TRUE) | |-------------------------------------+-------------------------------------------| | <test>2.225700000000000e+115</test> | <test>22257e111</test> | +-------------------------------------+-------------------------------------------+
以下示例演示如何按名称指定函数的实参:
SELECT PARSE_XML(STR => '<test>22257e111</test>', DISABLE_AUTO_CONVERT => TRUE);+--------------------------------------------------------------------------+ | PARSE_XML(STR => '<TEST>22257E111</TEST>', DISABLE_AUTO_CONVERT => TRUE) | |--------------------------------------------------------------------------| | <test>22257e111</test> | +--------------------------------------------------------------------------+