- Kategorien:
Funktionen für semistrukturierte und strukturierte Daten (Extraktion)
XMLGET¶
Extrahiert ein XML-Elementobjekt (oft einfach als Tag bezeichnet) aus dem Inhalt des äußeren XML-Elements, basierend auf dem Namen und der Instanznummer des angegebenen Tags.
(Beachten Sie, dass ein XML-Tag nicht dasselbe ist wie ein Data Governance-Tag in Snowflake).
Syntax¶
XMLGET( <expression> , <tag_name> [ , <instance_number> ] )
Argumente¶
expression
Der Ausdruck, aus dem das Element extrahiert werden soll.
Der Ausdruck muss ein OBJECT ergeben (oder einen VARIANT-Wert, der ein OBJECT enthält). Das OBJECT muss gültige XML in dem von Snowflake unterstützten internen Format enthalten. In der Regel bedeutet das, dass OBJECT durch eine der folgenden Aktionen erstellt wurde:
Aufruf der Funktion PARSE_XML
Laden der Daten (z. B. über den Befehl COPY INTO <Tabelle>) und Angabe, dass die Daten im XML-Format vorliegen.
Die Funktion XMLGET wirkt nicht direkt auf einen VARCHAR-Ausdruck, auch wenn dieser VARCHAR gültigen XML-Text enthält.
tag_name
Der Name eines XML-Tags, der in
expression
gespeichert ist.instance_number
Wenn XML mehrere Instanzen von
tag_name
enthält, dann verwenden Sie die Nummer der Instanzinstance_number
, um anzugeben, welche Instanz abgerufen werden soll. Wie ein Array-Index ist auch dieinstance_number
0-basiert, nicht 1-basiert.instance_number
kann weggelassen werden. In diesem Fall wird der Standardwert 0 verwendet.
Rückgabewerte¶
Der Datentyp des zurückgegebenen Werts ist OBJECT.
Die Funktion gibt in den folgenden Fällen NULL zurück:
Wenn ein Argument von XMLGET NULL ist.
Wenn die Tag-Instanz nicht gefunden wird.
Weitere Informationen dazu finden Sie in den Nutzungshinweisen.
Nutzungshinweise¶
Das Ergebnis von XMLGET ist nicht der Inhalt des Tags (d. h. der Text zwischen den Tags), sondern das gesamte Element (das öffnende Tag, der Inhalt und das schließende Tag). Aus dem zurückgegebenen OBJECT-Wert können Sie mit der Funktion GET den Tag-Namen, die Attributwerte des Tags und den Inhalt des Elements (einschließlich verschachtelter Tags) extrahieren:
Verwenden Sie
GET(tag, '@attrname')
, um Attributwerte zu extrahieren.Verwenden Sie zum Extrahieren des Inhalts
GET(tag, '$')
.Verwenden Sie
GET(tag, '@')
, um den Tag-Namen zu extrahieren.
Sie können verschachtelte Tags extrahieren, indem Sie XMLGET-Funktionsaufrufe verschachteln. Beispiel:
SELECT XMLGET(XMLGET(my_xml_column, 'my_tag'), 'my_inner_tag') ...;
Die Positionen der inneren Tags im Inhalt können mit
GET(tag, 'inner-tag-name')
ermittelt werden. Wenn der Inhalt mehrere Elemente enthält, werden die Positionen als Array dargestellt.Sie können XMLGET nicht verwenden, um das äußerste Element zu extrahieren. Um das äußerste Element zu erhalten, wählen Sie das
expression
selbst aus.
Beispiele¶
Das folgende Beispiel erstellt eine Tabelle mit einem OBJECT, das XML enthält, und verwendet dann die Funktion XMLGET, um Elemente aus diesem OBJECT zu extrahieren.
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> | | |
+-------------------------+------------------------------+---------------------------------------------------+
In diesem Beispiel wird gezeigt, wie GET mit XMLGET verwendet wird, um den Inhalt eines Elements abzurufen. Im Beispiel enthält das Tag level2
drei Elemente (Text und zwei verschachtelte Tags), sodass GET diese Elemente in einem ARRAY zurückgibt. Die verschachtelten Tags werden durch OBJECTs (Schlüssel-Wert-Paare) repräsentiert. Die Eigenschaft @
enthält den Namen des verschachtelten Tags und die Eigenschaft $
enthält den Inhalt des verschachtelten Tags.
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" |
| | } |
| | ] |
+-------------------------+--------------------+
Das folgende Beispiel zeigt, wie GET mit XMLGET verwendet wird, um das Attribut eines Tags abzurufen.
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> | |
+--------------------------------------------------+----------------+
Bemerkung
Weitere Beispiele für Abfragen, die die Funktion XMLGET verwenden, finden Sie unter Beispiele für die Arbeit mit XML.