Catégories :

Fonctions de données semi-structurées et structurées (Extraction)

XMLGET

Extrait un objet de l’élément XML (souvent appelé simplement balise) du contenu de l’élément XML extérieur en fonction du nom et du numéro d’instance de la balise spécifiée.

(Notez qu’une balise XML n’est pas la même qu’une balise de gouvernance des données Snowflake).

  • Si un argument de XMLGET est NULL, le résultat est NULL.

  • Si l’instance de la balise n’est pas trouvée, le résultat est NULL.

Syntaxe

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

Arguments

expression

L’expression dont on doit extraire l’élément.

L’expression doit correspondre à OBJECT (ou un VARIANT contenant un OBJECT). L’OBJECT doit contenir du XML valide dans le format interne que Snowflake prend en charge. Typiquement, cela signifie que l’OBJECT a été produit par l’un des éléments suivants :

  • Un appel de la fonction PARSE_XML.

  • Le chargement des données (par exemple, via la commande COPY INTO <table>) et la spécification que les données sont au format XML.

La fonction XMLGET n’opère pas directement sur une expression VARCHAR même si ce VARCHAR contient du texte XML valide.

tag_name

Le nom d’une balise XML stockée dans l”expression.

instance_number

Si le fichier XML contient plusieurs instances de tag_name, utilisez instance_number pour spécifier l’instance à récupérer. Comme un index de tableau, le instance_number est basé sur 0 et non sur 1.

instance_number peut être omis, auquel cas la valeur par défaut 0 est utilisée.

Renvoie

Le type de données de la valeur renvoyée est OBJECT.

Voir les notes sur l’utilisation pour plus d’informations.

Notes sur l’utilisation

  • Le résultat de XMLGET n’est pas le contenu de la balise (c’est-à-dire le texte entre les balises), mais l’élément entier (la balise ouvrante, le contenu et la balise fermante). La valeur de retour est OBJECT. À partir de cet OBJECT, vous pouvez extraire le nom de la balise, les valeurs des attributs de la balise et le contenu de l’élément (y compris les balises imbriquées) en utilisant la fonction GET :

    • Pour extraire les valeurs d’attribut, utilisez GET(tag, '@attrname').

    • Pour extraire le contenu, utilisez GET(tag, '$').

    • Pour extraire le nom du tag, utilisez GET(tag, '@').

  • Vous pouvez extraire des balises imbriquées en imbriquant des appels XMLGET(), par exemple :

    select xmlget(xmlget(my_xml_column, 'my_tag'), 'my_inner_tag') ...;
    
    Copy
  • Les positions des balises internes dans le contenu peuvent être obtenues en utilisant GET(tag, 'inner-tag-name') ; si le contenu contient plusieurs éléments, il sera représenté par un tableau.

  • Vous ne pouvez pas utiliser XMLGET pour extraire l’élément le plus éloigné. Pour obtenir l’élément le plus éloigné, il suffit de sélectionner l”expression elle-même.

Exemples

L’exemple suivant crée une table avec un OBJECT qui contient du XML, puis utilise XMLGET() pour extraire des éléments de cet 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

Cet exemple montre comment utiliser GET() avec XMLGET() pour récupérer le contenu d’un élément. Dans cet exemple, la balise level2 contient trois éléments (du texte et deux balises imbriquées), donc GET renvoie ces éléments dans un ARRAY. Les balises imbriquées sont représentées par des OBJECTs (paires clé-valeur). La propriété @ contient le nom de la balise imbriquée et la propriété $ contient le contenu de la balise imbriquée.

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

Cet exemple montre comment utiliser GET() avec XMLGET() pour récupérer un attribut d’une balise :

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