Funzioni di parsing
Funzioni di parsing degli script TapHome — PARSETEXT per il testo tra due modelli, PARSEJSON con JSONPath e PARSEXML con XPath — per leggere valori dalle risposte dei dispositivi.
Ultimo aggiornamento:
Le funzioni di parsing leggono valori dal testo restituito da un dispositivo — tipicamente la risposta di una richiesta HTTP o un messaggio ricevuto in uno script Packet parser. Accettano una stringa, una collezione di byte (collection<uint8>) o un blob, funzionano in ogni script e richiedono Core 2022.2 o più recente.
PARSETEXT
PARSETEXT restituisce la parte di un testo che segue un modello sinistro e termina prima di un modello destro; quando quella parte è un numero, viene restituito un numero.
| |
| Nome | Tipo | Descrizione |
|---|---|---|
source | string, collection<uint8> o blob | Testo in cui cercare. I byte vengono letti come iso-8859-1. |
leftPattern | string | Testo prima del valore. Più parti separate da ... vengono cercate una dopo l’altra. |
rightPattern | string, facoltativo | Testo dopo il valore. Senza di esso il valore termina al primo carattere che non è una lettera, una cifra o . (un + o - iniziale viene mantenuto). |
Valore restituito — un numero quando il testo trovato si legge come numero (con il punto decimale), altrimenti il testo senza spazi iniziali e finali. Null quando il modello sinistro non viene trovato.
Quando il modello sinistro viene trovato ma quello destro no, lo script si interrompe con l’errore Specified argument was out of the range of valid values. — non restituisce
Null. Quando il modello destro può mancare, verificalo prima conINDEXOF(verificato su Core 2026.1).
Esempio
# testo tra due modelli
PARSETEXT("Lorem ipsum dolor sit amet", "ipsum", "amet");
# Result: "dolor sit"
PARSETEXT("<temp>12.2</temp>", "<temp>", "</temp>");
# Result: 12.2
# senza modello destro il valore termina al primo altro carattere
PARSETEXT("<temp>12.2</temp>", "<temp>");
# Result: 12.2
PARSETEXT("status:ok,error:none", "status:");
# Result: "ok"
# più parti sinistre, cercate una dopo l'altra
PARSETEXT("Lorem ipsum dolor sit amet", "ipsum...sit");
# Result: "amet"
PARSETEXT("Lorem ipsum dolor sit amet consectetur adipiscing", "ipsum...sit", "adipiscing");
# Result: "amet consectetur"
# modello sinistro non trovato
PARSETEXT("a=1", "b=");
# Result: NullEsempio — modello destro che può mancare
# posizione del modello sinistro
VAR start := INDEXOF(text, "temp=");
# esce se manca il modello destro
IF start < 0 OR INDEXOF(COPY(text, start), ";") < 0
RETURN(NaN);
END
# legge il valore tra i modelli
PARSETEXT(text, "temp=", ";");PARSEJSON
PARSEJSON legge un valore da JSON con un’espressione JSONPath; con TRUE come terzo argomento restituisce Null invece di interrompere lo script quando il percorso non viene trovato.
| |
| Nome | Tipo | Descrizione |
|---|---|---|
json | string, collection<uint8> o blob | Testo JSON. |
path | string | JSONPath. Il prefisso $. è facoltativo. |
ignoreError | bool, facoltativo | TRUE (o 1): restituisce Null quando il percorso non viene trovato, il JSON non è valido o json è Null. Predefinito FALSE. |
Valore restituito — il valore nel percorso: una stringa, un numero o un bool. Più corrispondenze vengono restituite come collezione. Un oggetto o un array viene restituito come testo JSON, che può essere analizzato di nuovo.
| Percorso | Seleziona |
|---|---|
temperature, cloud.connected | Un campo, un campo annidato. |
$.devices[0].name | Un campo del primo elemento dell’array. |
$.devices[-1:].deviceId | L’ultimo elemento di un array. |
$[?(@.period == 1)].price | Elementi il cui campo soddisfa una condizione. |
Esempio — con json che contiene:
| |
# campo di primo livello
PARSEJSON(json, "firstName");
# Result: "John"
# campo annidato
PARSEJSON(json, "address.city");
# Result: "Nara"
PARSEJSON(json, "age");
# Result: 26
# percorso mancante: restituisce Null, nessun errore
PARSEJSON(json, "address.country", TRUE);
# Result: NullPARSEJSON(json, "address.country") senza il terzo argomento interrompe lo script con PARSEJSON - Element not found: ‘address.country’.
Esempio — ciclo su un array JSON
Con TRUE, PARSEJSON restituisce Null dopo l’ultimo elemento, il che termina il ciclo:
# contatore del ciclo e nomi raccolti
VAR i := 0;
VAR names := "";
# nome del primo elemento dell'array
VAR name := PARSEJSON(json, "$.devices[0].name", TRUE);
WHILE !ISNULL(name)
names := names + name + "\n";
i := i + 1;
# nome dell'elemento successivo
name := PARSEJSON(json, "$.devices[" + TOSTRING(i) + "].name", TRUE);
LOOP
# restituisce i nomi raccolti
names;Errori — PARSEJSON - Element not found: ‘path’; PARSEJSON - parse error: … (JSON non valido); PARSEJSON - argument 1 is null.
PARSEXML
PARSEXML legge un valore da XML con un’espressione XPath e restituisce il valore del primo nodo corrispondente.
| |
Valore restituito — il valore del primo nodo: un numero quando il testo si legge come numero, altrimenti una stringa; Null quando non c’è nessuna corrispondenza. Le funzioni XPath restituiscono il proprio risultato, ad esempio un numero da count().
Note
- I numeri nel testo dei nodi vengono letti secondo le impostazioni di lingua dell’unità di controllo. Per leggere un numero con il punto decimale indipendentemente da esse, racchiudi il percorso nella funzione XPath
number(). - I namespace dichiarati nel documento vengono registrati automaticamente. Un namespace con prefisso (
xmlns:dc="…") si usa con il suo prefisso; un namespace predefinito (xmlns="…") prende il nome dell’elemento che lo dichiara — per<DIDL-Lite xmlns="…">scriviDIDL-Lite:container. - I documenti più piccoli di 80 kB e le espressioni compilate vengono messi in cache, quindi le chiamate ripetute sulla stessa risposta sono poco costose.
Esempio — con la risposta che contiene:
| |
# corpo della risposta come testo XML
VAR xml := response.Content;
# titolo del secondo libro
PARSEXML(xml, "//book[2]/title");
# Result: "Midnight Rain"
# valore dell'attributo
PARSEXML(xml, "//book[1]/@id");
# Result: "bk101"
# number() legge il prezzo come numero con punto decimale
PARSEXML(xml, "number(//catalog/book[1]/price)");
# Result: 44.95
# count() restituisce il numero di nodi corrispondenti
PARSEXML(xml, "count(//book)");
# Result: 2
# nessuna corrispondenza: restituisce Null
PARSEXML(xml, "//catalog/magazine[1]/price");
# Result: NullEsempio — XML con namespace
VAR xml := response.Content;
PARSEXML(xml, "//DIDL-Lite:container[dc:title='My Playlist']/DIDL-Lite:res");Errori — PARSEXML - parse error: … (XML o XPath non valido).
Vedi anche — SENDHTTPREQUEST, DECODE.