TapHome

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.

1
2
PARSETEXT(source, leftPattern)
PARSETEXT(source, leftPattern, rightPattern)
NévTípusLeírás
sourceszöveg, collection<uint8> vagy blobA keresett szöveg. A bájtok iso-8859-1 kódolásként olvasódnak be.
leftPatternszövegAz érték előtti szöveg. A ... jellel elválasztott részeket egymás után keresi meg.
rightPatternszöveg, opcionálisAz é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 az INDEXOF fü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: Null

Pé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=", ";");

Lásd még — INDEXOF, COPY.

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ó.

1
2
PARSEJSON(json, path)
PARSEJSON(json, path, ignoreError)
NévTípusLeírás
jsonszöveg, collection<uint8> vagy blobJSON szöveg.
pathszövegJSONPath. A kezdő $. elhagyható.
ignoreErrorbool, opcionálisTRUE (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ő.

ÚtvonalMit választ ki
temperature, cloud.connectedEgy mezőt, egy beágyazott mezőt.
$.devices[0].nameA tömb első elemének egy mezőjét.
$.devices[-1:].deviceIdA tömb utolsó elemét.
$[?(@.period == 1)].priceAzokat az elemeket, amelyek mezője megfelel egy feltételnek.

Példa — ha a json tartalma:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
  "firstName": "John",
  "lastName": "Doe",
  "age": 26,
  "address": {
    "streetAddress": "Naist street",
    "city": "Nara",
    "postalCode": "630-0192"
  }
}
PARSEJSON(json, "firstName");
# Result: "John"
PARSEJSON(json, "address.city");
# Result: "Nara"
PARSEJSON(json, "age");
# Result: 26
PARSEJSON(json, "address.country", TRUE);
# Result: Null

A 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.

1
PARSEXML(xml, xpath)

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?xml version="1.0"?>
<catalog>
  <book id="bk101">
    <title>XML Developer's Guide</title>
    <price>44.95</price>
  </book>
  <book id="bk102">
    <title>Midnight Rain</title>
    <price>5.95</price>
  </book>
</catalog>
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: Null

Pé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.