- 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).
Syntaxe¶
XMLGET( <expression> , <tag_name> [ , <instance_number> ] )
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
, utilisezinstance_number
pour spécifier l’instance à récupérer. Comme un index de tableau, leinstance_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.
La fonction renvoie NULL dans les cas suivants :
Si un argument de XMLGET est NULL.
Si l’instance de la balise n’est pas trouvée.
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). À partir de la valeur OBJECT renvoyée, 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) à l’aide de 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 de fonctions XMLGET. Par exemple :
SELECT XMLGET(XMLGET(my_xml_column, 'my_tag'), 'my_inner_tag') ...;
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, les positions sont représentées sous forme de tableau.Vous ne pouvez pas utiliser XMLGET pour extraire l’élément le plus éloigné. Pour obtenir l’élément le plus éloigné, sélectionnez
expression
.
Exemples¶
L’exemple suivant crée une table avec un OBJECT qui contient du XML, puis utilise la fonction XMLGET pour extraire des éléments de cet OBJECT.
CREATE OR REPLACE 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> | | |
+-------------------------+------------------------------+---------------------------------------------------+
Cet exemple montre comment utiliser GET avec XMLGET pour récupérer le contenu d’un élément. Dans l’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'), '$') AS content_of_element
FROM xml_demo;
+-------------------------+--------------------+
| OBJECT_COL | CONTENT_OF_ELEMENT |
|-------------------------+--------------------|
| <level1> | [ |
| 1 | 2, |
| <level2> | { |
| 2 | "$": "3A", |
| <level3>3A</level3> | "@": "level3" |
| <level3>3B</level3> | }, |
| </level2> | { |
| </level1> | "$": "3B", |
| | "@": "level3" |
| | } |
| | ] |
+-------------------------+--------------------+
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>');
SELECT object_col,
GET(XMLGET(object_col, 'level2'), '@an_attribute') AS attribute
FROM xml_demo
WHERE ID = 1002;
+--------------------------------------------------+----------------+
| OBJECT_COL | ATTRIBUTE |
|--------------------------------------------------+----------------|
| <level1> | "my attribute" |
| 1 | |
| <level2 an_attribute="my attribute">2</level2> | |
| </level1> | |
+--------------------------------------------------+----------------+
Note
Pour d’autres exemples de requêtes utilisant la fonction XMLGET, voir Exemples d’utilisation de XML.