Parsovacie funkcie
Parsovacie funkcie skriptu TapHome — PARSETEXT na text medzi vzormi, PARSEJSON s JSONPath a PARSEXML s XPath — na čítanie hodnôt z odpovedí zariadení.
Parsovacie funkcie čítajú hodnoty z textu, ktorý vráti zariadenie — typicky z odpovede na HTTP požiadavku alebo z prijatej správy v skripte Packet parsera. Prijímajú reťazec, bajtovú kolekciu (collection<uint8>) alebo blob, fungujú v každom skripte a potrebujú Core 2022.2 alebo novší.
PARSETEXT
PARSETEXT vráti časť textu, ktorá nasleduje za ľavým vzorom a končí pred pravým vzorom; keď je táto časť číslo, vráti číslo.
| |
| Názov | Typ | Popis |
|---|---|---|
source | reťazec, collection<uint8> alebo blob | Prehľadávaný text. Bajty sa čítajú ako iso-8859-1. |
leftPattern | reťazec | Text pred hodnotou. Viac častí oddelených ... sa hľadá jedna po druhej. |
rightPattern | reťazec, voliteľný | Text za hodnotou. Bez neho hodnota končí na prvom znaku, ktorý nie je písmeno, číslica ani . (úvodné + alebo - sa ponechá). |
Návratová hodnota — číslo, keď sa nájdený text dá prečítať ako číslo (s desatinnou bodkou), inak text bez úvodných a koncových medzier. Null, keď sa ľavý vzor nenájde.
Keď sa ľavý vzor nájde, ale pravý nie, skript sa zastaví chybou Specified argument was out of the range of valid values. — nevráti
Null. Keď pravý vzor môže chýbať, overte ho najprv funkciouINDEXOF(overené na Core 2026.1, build 40599).
Prí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: NullPríklad — pravý vzor, ktorý môže chýbať
VAR start := INDEXOF(text, "temp=");
IF start < 0 OR INDEXOF(COPY(text, start), ";") < 0
RETURN(NaN);
END
PARSETEXT(text, "temp=", ";");PARSEJSON
PARSEJSON prečíta hodnotu z JSON pomocou výrazu JSONPath; s TRUE ako tretím argumentom vráti Null namiesto zastavenia skriptu, keď sa cesta nenájde.
| |
| Názov | Typ | Popis |
|---|---|---|
json | reťazec, collection<uint8> alebo blob | Text JSON. |
path | reťazec | JSONPath. Úvodné $. je voliteľné. |
ignoreError | bool, voliteľný | TRUE (alebo 1): vráti Null, keď sa cesta nenájde, JSON je neplatný alebo json je Null. Predvolene FALSE. |
Návratová hodnota — hodnota na zadanej ceste: reťazec, číslo alebo bool. Viac zhôd sa vráti ako kolekcia. Objekt alebo pole sa vráti ako svoj text JSON, ktorý sa dá znova parsovať.
| Cesta | Vyberie |
|---|---|
temperature, cloud.connected | Položku, vnorenú položku. |
$.devices[0].name | Položku prvého prvku poľa. |
$.devices[-1:].deviceId | Posledný prvok poľa. |
$[?(@.period == 1)].price | Prvky, ktorých položka spĺňa podmienku. |
Príklad — keď 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 tretieho argumentu zastaví skript chybou PARSEJSON - Element not found: ‘address.country’.
Príklad — cyklus cez JSON pole
S TRUE vráti PARSEJSON za posledným prvkom Null, čím sa cyklus skončí:
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 prečíta hodnotu z XML pomocou výrazu XPath a vráti hodnotu prvého zodpovedajúceho uzla.
| |
Návratová hodnota — hodnota prvého uzla: číslo, keď sa text dá prečítať ako číslo, inak reťazec; Null, keď nič nevyhovuje. Funkcie XPath vracajú vlastný výsledok, napríklad číslo z count().
Poznámky
- Čísla v texte uzlov sa čítajú podľa jazykových nastavení riadiacej jednotky. Ak chcete prečítať číslo s desatinnou bodkou nezávisle od nich, obaľte cestu funkciou XPath
number(). - Menné priestory deklarované v dokumente sa registrujú automaticky. Menný priestor s prefixom (
xmlns:dc="…") sa používa so svojím prefixom; predvolený menný priestor (xmlns="…") dostane názov prvku, ktorý ho deklaruje — pre<DIDL-Lite xmlns="…">napíšteDIDL-Lite:container. - Dokumenty menšie ako 80 kB a skompilované výrazy sa ukladajú do vyrovnávacej pamäte, takže opakované volania nad tou istou odpoveďou sú lacné.
Príklad — keď odpoveď 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: NullPríklad — XML s mennými priestormi
VAR xml := response.Content;
PARSEXML(xml, "//DIDL-Lite:container[dc:title='My Playlist']/DIDL-Lite:res");Chyby — PARSEXML - parse error: … (neplatné XML alebo XPath).
Pozrite aj — SENDHTTPREQUEST, DECODE.