Elemző függvények
TapHome szkript elemző függvények — PARSETEXT a minták közötti szöveghez, PARSEJSON JSONPath-szal és PARSEXML XPath-szal — értékek kiolvasásához az eszközök válaszaiból.
Az elemző függvények az eszköz által visszaadott szövegből olvasnak ki értékeket — jellemzően egy HTTP-kérés válaszából vagy egy Packet parser szkriptben fogadott üzenetből. Szöveget, bájtgyűjteményt (collection<uint8>) vagy blobot fogadnak, minden szkriptben működnek, és Core 2022.2 vagy újabb verziót igényelnek.
PARSETEXT
A PARSETEXT a szövegnek azt a részét adja vissza, amely egy bal oldali minta után következik és egy jobb oldali minta előtt ér véget; ha ez a rész szám, számot ad vissza.
| |
| Név | Típus | Leírás |
|---|---|---|
source | szöveg, collection<uint8> vagy blob | A keresett szöveg. A bájtok iso-8859-1 kódolásként olvasódnak be. |
leftPattern | szöveg | Az érték előtti szöveg. A ... jellel elválasztott részeket egymás után keresi meg. |
rightPattern | szöveg, opcionális | Az érték utáni szöveg. Nélküle az érték az első olyan karakternél ér véget, amely nem betű, számjegy vagy . (a kezdő + vagy - megmarad). |
Visszatérési érték — szám, ha a talált szöveg számként olvasható (tizedesponttal), egyébként a szöveg a szóközök levágásával. Null, ha a bal oldali minta nem található.
Ha a bal oldali minta megvan, de a jobb oldali nincs, a szkript a Specified argument was out of the range of valid values. hibával leáll — nem
Nullértéket ad vissza. Ha a jobb oldali minta hiányozhat, előbb ellenőrizd azINDEXOFfüggvénnyel (ellenőrizve Core 2026.1, build 40599 verzión).
Példa
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élda — esetleg hiányzó jobb oldali minta
VAR start := INDEXOF(text, "temp=");
IF start < 0 OR INDEXOF(COPY(text, start), ";") < 0
RETURN(NaN);
END
PARSETEXT(text, "temp=", ";");PARSEJSON
A PARSEJSON JSONPath kifejezéssel olvas ki értéket JSON-ból; harmadik argumentumként TRUE értékkel a szkript leállítása helyett Null értéket ad vissza, ha az útvonal nem található.
| |
| Név | Típus | Leírás |
|---|---|---|
json | szöveg, collection<uint8> vagy blob | JSON szöveg. |
path | szöveg | JSONPath. A kezdő $. elhagyható. |
ignoreError | bool, opcionális | TRUE (vagy 1): Null értéket ad vissza, ha az útvonal nem található, a JSON érvénytelen, vagy a json értéke Null. Alapértelmezés: FALSE. |
Visszatérési érték — az útvonalon lévő érték: szöveg, szám vagy bool. Több találat esetén gyűjteményt ad vissza. Objektumot vagy tömböt a JSON szövegeként ad vissza, amely újra elemezhető.
| Útvonal | Mit választ ki |
|---|---|
temperature, cloud.connected | Egy mezőt, egy beágyazott mezőt. |
$.devices[0].name | A tömb első elemének egy mezőjét. |
$.devices[-1:].deviceId | A tömb utolsó elemét. |
$[?(@.period == 1)].price | Azokat az elemeket, amelyek mezője megfelel egy feltételnek. |
Példa — ha a json tartalma:
| |
PARSEJSON(json, "firstName");
# Result: "John"
PARSEJSON(json, "address.city");
# Result: "Nara"
PARSEJSON(json, "age");
# Result: 26
PARSEJSON(json, "address.country", TRUE);
# Result: NullA harmadik argumentum nélküli PARSEJSON(json, "address.country") a PARSEJSON - Element not found: ‘address.country’ hibával leállítja a szkriptet.
Példa — ciklus JSON tömbön
TRUE értékkel a PARSEJSON az utolsó elem után Null értéket ad vissza, ami befejezi a ciklust:
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;Hibák — PARSEJSON - Element not found: ‘path’; PARSEJSON - parse error: … (érvénytelen JSON); PARSEJSON - argument 1 is null.
PARSEXML
A PARSEXML XPath kifejezéssel olvas ki értéket XML-ből, és az első illeszkedő csomópont értékét adja vissza.
| |
Visszatérési érték — az első csomópont értéke: szám, ha a szöveg számként olvasható, egyébként szöveg; Null, ha semmi sem illeszkedik. Az XPath függvények a saját eredményüket adják vissza, például a count() egy számot.
Megjegyzések
- A csomópontok szövegében lévő számok a vezérlőegység nyelvi beállításai szerint olvasódnak be. Ha ettől függetlenül tizedesponttal szeretnél számot beolvasni, foglald az útvonalat a
number()XPath függvénybe. - A dokumentumban deklarált névterek automatikusan regisztrálódnak. Az előtaggal rendelkező névteret (
xmlns:dc="…") az előtagjával használod; az alapértelmezett névtér (xmlns="…") annak az elemnek a nevét kapja, amely deklarálja — a<DIDL-Lite xmlns="…">esetén írd:DIDL-Lite:container. - A 80 kB-nál kisebb dokumentumok és a lefordított kifejezések gyorsítótárba kerülnek, így az ugyanarra a válaszra irányuló ismételt hívások olcsók.
Példa — ha a válasz tartalma:
| |
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élda — XML névterekkel
VAR xml := response.Content;
PARSEXML(xml, "//DIDL-Lite:container[dc:title='My Playlist']/DIDL-Lite:res");Hibák — PARSEXML - parse error: … (érvénytelen XML vagy XPath).
Lásd még — SENDHTTPREQUEST, DECODE.