TapHome

Funkcije za raščlambu

Funkcije za raščlambu u skripti TapHome — PARSETEXT za tekst između uzoraka, PARSEJSON s JSONPath i PARSEXML s XPath — za čitanje vrijednosti iz odgovora uređaja.

Funkcije za raščlambu čitaju vrijednosti iz teksta koji vraća uređaj — obično odgovora na HTTP zahtjev ili primljene poruke u skripti Packet parsera. Prihvaćaju string, zbirku bajtova (collection<uint8>) ili blob, rade u svakoj skripti i zahtijevaju Core 2022.2 ili noviji.

PARSETEXT

PARSETEXT vraća dio teksta koji slijedi iza lijevog uzorka i završava prije desnog uzorka; kada je taj dio broj, vraća se broj.

1
2
PARSETEXT(source, leftPattern)
PARSETEXT(source, leftPattern, rightPattern)
NazivTipOpis
sourcestring, collection<uint8> ili blobTekst koji se pretražuje. Bajtovi se čitaju kao iso-8859-1.
leftPatternstringTekst prije vrijednosti. Više dijelova odvojenih s ... traži se jedan za drugim.
rightPatternstring, neobaveznoTekst iza vrijednosti. Bez njega vrijednost završava na prvom znaku koji nije slovo, znamenka ili . (vodeći + ili - se zadržava).

Vraća — broj kada se pronađeni tekst čita kao broj (s decimalnom točkom), inače tekst bez razmaka na rubovima. Null kada lijevi uzorak nije pronađen.

Kada je lijevi uzorak pronađen, a desni nije, skripta se zaustavlja pogreškom Specified argument was out of the range of valid values. — ne vraća Null. Kada desni uzorak može nedostajati, najprije ga provjerite funkcijom INDEXOF (provjereno na Core 2026.1).

Primjer

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

Primjer — desni uzorak koji može nedostajati

VAR start := INDEXOF(text, "temp=");
IF start < 0 OR INDEXOF(COPY(text, start), ";") < 0
    RETURN(NaN);
END
PARSETEXT(text, "temp=", ";");

Vidi također — INDEXOF, COPY.

PARSEJSON

PARSEJSON čita vrijednost iz JSON-a izrazom JSONPath; s TRUE kao trećim argumentom vraća Null umjesto da zaustavi skriptu kada putanja nije pronađena.

1
2
PARSEJSON(json, path)
PARSEJSON(json, path, ignoreError)
NazivTipOpis
jsonstring, collection<uint8> ili blobTekst JSON.
pathstringJSONPath. Početni $. nije obavezan.
ignoreErrorbool, neobaveznoTRUE (ili 1): vraća Null kada putanja nije pronađena, JSON nije valjan ili je json Null. Zadano FALSE.

Vraća — vrijednost na putanji: string, broj ili bool. Više podudaranja vraća se kao zbirka. Objekt ili polje vraća se kao njegov tekst JSON, koji se može ponovno raščlaniti.

PutanjaOdabire
temperature, cloud.connectedPolje, ugniježđeno polje.
$.devices[0].namePolje prvog elementa polja.
$.devices[-1:].deviceIdPosljednji element polja.
$[?(@.period == 1)].priceElemente čije polje zadovoljava uvjet.

Primjer — kada json sadrži:

 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 trećeg argumenta zaustavlja skriptu pogreškom PARSEJSON - Element not found: ‘address.country’.

Primjer — petlja kroz JSON polje

S TRUE funkcija PARSEJSON nakon posljednjeg elementa vraća Null, čime petlja završava:

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;

Pogreške — PARSEJSON - Element not found: ‘path’; PARSEJSON - parse error: … (nevaljan JSON); PARSEJSON - argument 1 is null.

PARSEXML

PARSEXML čita vrijednost iz XML-a izrazom XPath i vraća vrijednost prvog odgovarajućeg čvora.

1
PARSEXML(xml, xpath)

Vraća — vrijednost prvog čvora: broj kada se tekst čita kao broj, inače string; Null kada ništa ne odgovara. Funkcije XPath vraćaju vlastiti rezultat, na primjer broj iz count().

Napomene

  • Brojevi u tekstu čvora čitaju se prema jezičnim postavkama centralne jedinice. Da biste broj s decimalnom točkom pročitali neovisno o njima, putanju omotajte funkcijom XPath number().
  • Imenski prostori deklarirani u dokumentu registriraju se automatski. Imenski prostor s prefiksom (xmlns:dc="…") koristi se sa svojim prefiksom; zadani imenski prostor (xmlns="…") dobiva naziv elementa koji ga deklarira — za <DIDL-Lite xmlns="…"> napišite DIDL-Lite:container.
  • Dokumenti manji od 80 kB i prevedeni izrazi spremaju se u međuspremnik, pa su ponovljeni pozivi nad istim odgovorom jeftini.

Primjer — kada odgovor sadrži:

 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

Primjer — XML s imenskim prostorima

VAR xml := response.Content;
PARSEXML(xml, "//DIDL-Lite:container[dc:title='My Playlist']/DIDL-Lite:res");

Pogreške — PARSEXML - parse error: … (nevaljan XML ili XPath).

Vidi također — SENDHTTPREQUEST, DECODE.