- 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> ] )
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.
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') ...;
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>');
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 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" |
| | } |
| | ] |
+-------------------------+----------------------------------------+
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')
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> | |
+--------------------------------------------------+----------------------------------------------------+