Categorias:

Funções de dados semiestruturados e estruturados (Extração)

XMLGET

Extrai um objeto de elemento XML (normalmente referido simplesmente como uma tag) do conteúdo do elemento externo XML com base no nome e número de instância da tag especificada.

(Note que uma tag XML não é o mesmo que uma tag de governança de dados do Snowflake.)

  • Se qualquer argumento de XMLGET for NULL, o resultado será NULL.

  • Se a instância da tag não for encontrada, o resultado será NULL.

Sintaxe

XMLGET( <expression> , <tag_name> [ , <instance_number> ] )
Copy

Argumentos

expression

A expressão a partir da qual se extrai o elemento.

A expressão deve avaliar como um OBJECT (ou um VARIANT contendo um OBJECT). O OBJECT deve conter XML válido no formato interno que o Snowflake suporta. Normalmente, isso significa que o OBJECT foi produzido por uma das seguintes opções:

  • Chamada da função PARSE_XML.

  • Carregamento dos dados (por exemplo, pelo comando COPY INTO <tabela>) e especificação que os dados estão no formato XML.

A função XMLGET não opera diretamente sobre uma expressão VARCHAR mesmo que esse VARCHAR contenha um texto XML válido.

tag_name

O nome de uma tag XML armazenada no expression.

instance_number

Se o XML tiver múltiplas instâncias de tag_name, então use instance_number para especificar qual instância deve ser recuperada. Como um índice de matriz, o instance_number é baseado em 0, não baseado em 1.

instance_number pode ser omitido, caso em que é utilizado o valor padrão 0.

Retornos

O tipo de dados do valor retornado é OBJECT.

Consulte as Notas de Uso para obter mais detalhes.

Notas de uso

  • O resultado de XMLGET não é o conteúdo da tag (ou seja, o texto entre as tags), mas o elemento inteiro (a tag de abertura, conteúdo e tag de fechamento). O valor de retorno é um OBJECT. A partir deste OBJECT, você pode extrair o nome da tag, os valores dos atributos da tag e o conteúdo do elemento (incluindo tags aninhadas) usando a função GET:

    • Para extrair valores de atributos, use GET(tag, '@attrname').

    • Para extrair o conteúdo, use GET(tag, '$').

    • Para extrair o nome da tag, use GET(tag, '@').

  • Você pode extrair tags aninhadas ao aninhar chamadas XMLGET(), por exemplo

    select xmlget(xmlget(my_xml_column, 'my_tag'), 'my_inner_tag') ...;
    
    Copy
  • As posições das tags internas no conteúdo podem ser obtidas usando GET(tag, 'inner-tag-name'); se o conteúdo contiver vários elementos, as posições serão representadas como uma matriz.

  • Não se pode usar XMLGET para extrair o elemento mais externo. Para obter o elemento mais externo, basta selecionar o próprio expression.

Exemplos

O exemplo seguinte cria uma tabela com um OBJECT que contém XML, depois utiliza XMLGET() para extrair elementos desse 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>');
Copy
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>               |                              |                                                   |
+-------------------------+------------------------------+---------------------------------------------------+
Copy

Este exemplo mostra como usar GET() com XMLGET() para recuperar o conteúdo de um elemento. Neste exemplo, a tag level2 contém três itens (texto e duas tags aninhadas), portanto GET retorna estes itens em um ARRAY. As tags aninhadas são representadas por OBJECTs (pares chave-valor). A propriedade @ contém o nome da tag aninhada e a propriedade $ contém o conteúdo da tag aninhada.

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"                      |
|                         |   }                                    |
|                         | ]                                      |
+-------------------------+----------------------------------------+
Copy

Este exemplo mostra como usar GET() com XMLGET() para recuperar um atributo de uma tag:

INSERT INTO xml_demo (id, object_col)
    SELECT 1002,
        PARSE_XML('<level1> 1 <level2 an_attribute="my attribute"> 2 </level2> </level1>');
Copy
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>                                        |                                                    |
+--------------------------------------------------+----------------------------------------------------+
Copy