Funkce pro parsování
Funkce skriptu TapHome pro parsování — PARSETEXT pro text mezi vzory, PARSEJSON s JSONPath a PARSEXML s XPath — pro čtení hodnot z odpovědí zařízení.
Funkce pro parsování čtou hodnoty z textu, který vrací zařízení — typicky z odpovědi na požadavek HTTP nebo z přijaté zprávy ve skriptu Packet parser. Přijímají řetězec, kolekci bajtů (collection<uint8>) nebo blob, fungují v každém skriptu a vyžadují Core 2022.2 nebo novější.
PARSETEXT
PARSETEXT vrátí část textu, která následuje za levým vzorem a končí před pravým vzorem; když je ta část číslo, vrátí číslo.
| |
| Název | Typ | Popis |
|---|---|---|
source | řetězec, collection<uint8> nebo blob | Prohledávaný text. Bajty se čtou jako iso-8859-1. |
leftPattern | řetězec | Text před hodnotou. Více částí oddělených ... se hledá jedna po druhé. |
rightPattern | řetězec, nepovinný | Text za hodnotou. Bez něj hodnota končí u prvního znaku, který není písmeno, číslice ani . (úvodní + nebo - zůstává). |
Vrací — číslo, když nalezený text lze přečíst jako číslo (s desetinnou tečkou), jinak text s oříznutými mezerami. Null, když levý vzor není nalezen.
Když je levý vzor nalezen, ale pravý ne, skript se zastaví chybou Specified argument was out of the range of valid values. — nevrátí
Null. Když pravý vzor může chybět, ověřte ho nejprve přesINDEXOF(ověřeno na Core 2026.1, build 40599).
Příklad
PARSETEXT("Lorem ipsum dolor sit amet", "ipsum", "amet");
# Result: "dolor sit"
PARSETEXT("<temp>12.2</temp>", "<temp>", "</temp>");
# Result: 12.2
PARSETEXT("<temp>12.2</temp>", "<temp>");
# Result: 12.2
PARSETEXT("status:ok,error:none", "status:");
# Result: "ok"
PARSETEXT("Lorem ipsum dolor sit amet", "ipsum...sit");
# Result: "amet"
PARSETEXT("Lorem ipsum dolor sit amet consectetur adipiscing", "ipsum...sit", "adipiscing");
# Result: "amet consectetur"
PARSETEXT("a=1", "b=");
# Result: NullPříklad — pravý vzor, který může chybět
VAR start := INDEXOF(text, "temp=");
IF start < 0 OR INDEXOF(COPY(text, start), ";") < 0
RETURN(NaN);
END
PARSETEXT(text, "temp=", ";");PARSEJSON
PARSEJSON přečte hodnotu z JSON výrazem JSONPath; s TRUE jako třetím argumentem vrátí Null místo zastavení skriptu, když cesta není nalezena.
| |
| Název | Typ | Popis |
|---|---|---|
json | řetězec, collection<uint8> nebo blob | Text JSON. |
path | řetězec | JSONPath. Úvodní $. je volitelné. |
ignoreError | bool, volitelný | TRUE (nebo 1): vrátit Null, když cesta není nalezena, JSON je neplatný nebo json je Null. Výchozí FALSE. |
Vrací — hodnotu na dané cestě: řetězec, číslo nebo bool. Více shod se vrátí jako kolekce. Objekt nebo pole se vrátí jako svůj text JSON, který lze znovu parsovat.
| Cesta | Vybere |
|---|---|
temperature, cloud.connected | Položka, vnořená položka. |
$.devices[0].name | Položka prvního prvku pole. |
$.devices[-1:].deviceId | Poslední prvek pole. |
$[?(@.period == 1)].price | Prvky, jejichž položka splňuje podmínku. |
Příklad — když json obsahuje:
| |
PARSEJSON(json, "firstName");
# Result: "John"
PARSEJSON(json, "address.city");
# Result: "Nara"
PARSEJSON(json, "age");
# Result: 26
PARSEJSON(json, "address.country", TRUE);
# Result: NullPARSEJSON(json, "address.country") bez třetího argumentu zastaví skript chybou PARSEJSON - Element not found: ‘address.country’.
Příklad — procházení pole JSON v cyklu
S TRUE vrátí PARSEJSON za posledním prvkem Null, což cyklus ukončí:
VAR i := 0;
VAR names := "";
VAR name := PARSEJSON(json, "$.devices[0].name", TRUE);
WHILE !ISNULL(name)
names := names + name + "\n";
i := i + 1;
name := PARSEJSON(json, "$.devices[" + TOSTRING(i) + "].name", TRUE);
LOOP
names;Chyby — PARSEJSON - Element not found: ‘path’; PARSEJSON - parse error: … (neplatný JSON); PARSEJSON - argument 1 is null.
PARSEXML
PARSEXML přečte hodnotu z XML výrazem XPath a vrátí hodnotu prvního vyhovujícího uzlu.
| |
Vrací — hodnotu prvního uzlu: číslo, když text lze přečíst jako číslo, jinak řetězec; Null, když nic nevyhovuje. Funkce XPath vracejí vlastní výsledek, například číslo z count().
Poznámky
- Čísla v textu uzlu se čtou podle jazykového nastavení řídicí jednotky. Chcete-li číslo s desetinnou tečkou přečíst nezávisle na něm, obalte cestu funkcí XPath
number(). - Jmenné prostory deklarované v dokumentu se registrují automaticky. Jmenný prostor s prefixem (
xmlns:dc="…") se používá se svým prefixem; výchozí jmenný prostor (xmlns="…") dostane název prvku, který ho deklaruje — pro<DIDL-Lite xmlns="…">pišteDIDL-Lite:container. - Dokumenty menší než 80 kB a zkompilované výrazy se ukládají do mezipaměti, takže opakovaná volání nad stejnou odpovědí jsou levná.
Příklad — když odpověď obsahuje:
| |
VAR xml := response.Content;
PARSEXML(xml, "//book[2]/title");
# Result: "Midnight Rain"
PARSEXML(xml, "//book[1]/@id");
# Result: "bk101"
PARSEXML(xml, "number(//catalog/book[1]/price)");
# Result: 44.95
PARSEXML(xml, "count(//book)");
# Result: 2
PARSEXML(xml, "//catalog/magazine[1]/price");
# Result: NullPříklad — XML se jmennými prostory
VAR xml := response.Content;
PARSEXML(xml, "//DIDL-Lite:container[dc:title='My Playlist']/DIDL-Lite:res");Chyby — PARSEXML - parse error: … (neplatné XML nebo XPath).
Viz také — SENDHTTPREQUEST, DECODE.