- 类别:
半结构化和结构化数据函数 (提取)
XMLGET¶
根据指定标签的名称和实例编号,从外部 XML 元素的内容中提取 XML 元素对象(通常简称为 标签)。
(请注意,XML 标签与 Snowflake 数据治理标签 不同。
如果 XMLGET 的任何实参为 NULL,则结果为 NULL。
如果未找到标签实例,则结果为 NULL。
语法¶
XMLGET( <expression> , <tag_name> [ , <instance_number> ] )
实参¶
expression
要从中提取元素的表达式。
表达式的计算结果必须为 OBJECT (或包含 OBJECT 的 VARIANT)。OBJECT 必须包含 Snowflake 支持的内部格式的有效 XML。通常,这意味着 OBJECT 由以下之一生成:
调用 PARSE_XML 函数。
加载数据(例如通过 COPY INTO <table> 命令)并指定数据为 XML 格式。
XMLGET 函数不会直接对 VARCHAR 表达式进行操作,即使 VARCHAR 包含有效的 XML 文本也是如此。
tag_name
存储在 XML 中的
expression
标签的名称。instance_number
如果 XML 包含
tag_name
的多个实例,则使用instance_number
指定要检索的实例。与数组索引一样,instance_number
从 0 开始,而不是从 1 开始。instance_number
可以省略,在这种情况下,使用默认值 0。
返回¶
返回值的数据类型是 OBJECT。
有关更多详细信息,请参阅使用说明。
使用说明¶
XMLGET 的结果不是标签的内容(即标签之间的文本),而是整个元素(开始标签、内容和结束标签)。返回值为 OBJECT。从此 OBJECT 中,可以使用 GET 函数提取标签名称、标签的属性值以及元素的内容(包括嵌套标签):
要提取属性值,请使用
GET(tag, '@attrname')
。要提取内容,请使用
GET(tag, '$')
。要提取标签名称,请使用
GET(tag, '@')
。
您可以通过嵌套 XMLGET() 调用来提取嵌套标签,例如:
select xmlget(xmlget(my_xml_column, 'my_tag'), 'my_inner_tag') ...;
可以使用
GET(tag, 'inner-tag-name')
获取内容中内部标签的位置;如果内容包含多个元素,则位置将表示为数组。您不能使用 XMLGET 来提取最外层元素。要获取最外层元素,只需选择
expression
本身。
示例¶
以下示例创建了一个具有包含 XML 的 OBJECT 的表,然后使用 XMLGET() 从该 OBJECT 中提取元素。
CREATE TABLE xml_demo (ID INTEGER, object_col OBJECT);
INSERT INTO xml_demo (id, object_col)
SELECT 1001,
PARSE_XML('<level1> 1 <level2> 2 <level3> 3A </level3> <level3> 3B </level3> </level2> </level1>');
SELECT object_col,
XMLGET(object_col, 'level2'),
XMLGET(XMLGET(object_col, 'level2'), 'level3', 1)
FROM xml_demo;
+-------------------------+------------------------------+---------------------------------------------------+
| OBJECT_COL | XMLGET(OBJECT_COL, 'LEVEL2') | XMLGET(XMLGET(OBJECT_COL, 'LEVEL2'), 'LEVEL3', 1) |
|-------------------------+------------------------------+---------------------------------------------------|
| <level1> | <level2> | <level3>3B</level3> |
| 1 | 2 | |
| <level2> | <level3>3A</level3> | |
| 2 | <level3>3B</level3> | |
| <level3>3A</level3> | </level2> | |
| <level3>3B</level3> | | |
| </level2> | | |
| </level1> | | |
+-------------------------+------------------------------+---------------------------------------------------+
此示例演示了如何将 GET() 与 XMLGET() 结合使用来检索元素的内容。在此示例中,level2
标签包含三个项目(文本和两个嵌套标签),因此 GET 以 ARRAY 形式返回这些项目。嵌套标签由 OBJECTs(键值对)表示。@
属性包含嵌套标签名称,$
属性包含嵌套标签内容。
SELECT object_col,
GET(XMLGET(object_col, 'level2'), '$')
FROM xml_demo;
+-------------------------+----------------------------------------+
| OBJECT_COL | GET(XMLGET(OBJECT_COL, 'LEVEL2'), '$') |
|-------------------------+----------------------------------------|
| <level1> | [ |
| 1 | 2, |
| <level2> | { |
| 2 | "$": "3A", |
| <level3>3A</level3> | "@": "level3" |
| <level3>3B</level3> | }, |
| </level2> | { |
| </level1> | "$": "3B", |
| | "@": "level3" |
| | } |
| | ] |
+-------------------------+----------------------------------------+
此示例演示了如何将 GET() 与 XMLGET() 结合使用来检索标签的属性:
INSERT INTO xml_demo (id, object_col)
SELECT 1002,
PARSE_XML('<level1> 1 <level2 an_attribute="my attribute"> 2 </level2> </level1>');
SELECT object_col,
GET(XMLGET(object_col, 'level2'), '@an_attribute')
FROM xml_demo
WHERE ID = 1002;
+--------------------------------------------------+----------------------------------------------------+
| OBJECT_COL | GET(XMLGET(OBJECT_COL, 'LEVEL2'), '@AN_ATTRIBUTE') |
|--------------------------------------------------+----------------------------------------------------|
| <level1> | "my attribute" |
| 1 | |
| <level2 an_attribute="my attribute">2</level2> | |
| </level1> | |
+--------------------------------------------------+----------------------------------------------------+