TapHome

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.

1
2
PARSETEXT(source, leftPattern)
PARSETEXT(source, leftPattern, rightPattern)
NázovTypPopis
sourcereťazec, collection<uint8> alebo blobPrehľadávaný text. Bajty sa čítajú ako iso-8859-1.
leftPatternreťazecText pred hodnotou. Viac častí oddelených ... sa hľadá jedna po druhej.
rightPatternreť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 funkciou INDEXOF (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: Null

Prí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=", ";");

Pozrite aj — INDEXOF, COPY.

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.

1
2
PARSEJSON(json, path)
PARSEJSON(json, path, ignoreError)
NázovTypPopis
jsonreťazec, collection<uint8> alebo blobText JSON.
pathreťazecJSONPath. Úvodné $. je voliteľné.
ignoreErrorbool, 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ť.

CestaVyberie
temperature, cloud.connectedPoložku, vnorenú položku.
$.devices[0].namePoložku prvého prvku poľa.
$.devices[-1:].deviceIdPosledný prvok poľa.
$[?(@.period == 1)].pricePrvky, ktorých položka spĺňa podmienku.

Príklad — keď json obsahuje:

 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

PARSEJSON(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.

1
PARSEXML(xml, xpath)

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íšte DIDL-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:

 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

Prí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.