TapHome

Funcții de parsare

Funcțiile de parsare din scripturile TapHome — PARSETEXT pentru textul dintre șabloane, PARSEJSON cu JSONPath și PARSEXML cu XPath — pentru citirea valorilor din răspunsurile dispozitivelor.

Funcțiile de parsare citesc valori din textul pe care îl returnează un dispozitiv — de regulă răspunsul unei cereri HTTP sau un mesaj primit într-un script Packet parser. Acceptă un șir de caractere, o colecție de octeți (collection<uint8>) sau un blob, funcționează în orice script și necesită Core 2022.2 sau mai nou.

PARSETEXT

PARSETEXT returnează partea unui text care urmează după un șablon din stânga și se termină înaintea unui șablon din dreapta; când această parte este un număr, se returnează un număr.

1
2
PARSETEXT(source, leftPattern)
PARSETEXT(source, leftPattern, rightPattern)
NumeTipDescriere
sourceșir de caractere, collection<uint8> sau blobTextul în care se caută. Octeții se citesc ca iso-8859-1.
leftPatternșir de caractereTextul dinaintea valorii. Mai multe părți separate prin ... se caută una după alta.
rightPatternșir de caractere, opționalTextul de după valoare. Fără el, valoarea se termină la primul caracter care nu este literă, cifră sau . (un + sau - de la început se păstrează).

Returnează — un număr când textul găsit se citește ca număr (cu punct zecimal), altfel textul fără spațiile de la margini. Null când șablonul din stânga nu este găsit.

Când șablonul din stânga este găsit, dar cel din dreapta nu, scriptul se oprește cu eroarea Specified argument was out of the range of valid values. — nu returnează Null. Când șablonul din dreapta poate lipsi, verificați-l mai întâi cu INDEXOF (verificat pe Core 2026.1).

Exemplu

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

Exemplu — șablon din dreapta care poate lipsi

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

Consultați și — INDEXOF, COPY.

PARSEJSON

PARSEJSON citește o valoare din JSON cu o expresie JSONPath; cu TRUE ca al treilea argument returnează Null în loc să oprească scriptul când calea nu este găsită.

1
2
PARSEJSON(json, path)
PARSEJSON(json, path, ignoreError)
NumeTipDescriere
jsonșir de caractere, collection<uint8> sau blobText JSON.
pathșir de caractereJSONPath. Prefixul $. de la început este opțional.
ignoreErrorbool, opționalTRUE (sau 1): returnează Null când calea nu este găsită, JSON-ul nu este valid sau json este Null. Implicit FALSE.

Returnează — valoarea de la calea dată: un șir de caractere, un număr sau un bool. Mai multe potriviri se returnează ca o colecție. Un obiect sau un tablou se returnează ca text JSON, care se poate parsa din nou.

CaleSelectează
temperature, cloud.connectedUn câmp, un câmp imbricat.
$.devices[0].nameUn câmp al primului element al tabloului.
$.devices[-1:].deviceIdUltimul element al unui tablou.
$[?(@.period == 1)].priceElementele al căror câmp îndeplinește o condiție.

Exemplu — când json conține:

 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") fără al treilea argument oprește scriptul cu PARSEJSON - Element not found: ‘address.country’.

Exemplu — buclă peste un tablou JSON

Cu TRUE, PARSEJSON returnează Null după ultimul element, ceea ce încheie bucla:

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;

Erori — PARSEJSON - Element not found: ‘path’; PARSEJSON - parse error: … (JSON nevalid); PARSEJSON - argument 1 is null.

PARSEXML

PARSEXML citește o valoare din XML cu o expresie XPath și returnează valoarea primului nod care se potrivește.

1
PARSEXML(xml, xpath)

Returnează — valoarea primului nod: un număr când textul se citește ca număr, altfel un șir de caractere; Null când nu se potrivește nimic. Funcțiile XPath returnează propriul rezultat, de exemplu un număr din count().

Observații

  • Numerele din textul nodurilor se citesc după setările de limbă ale unității de control. Pentru a citi un număr cu punct zecimal indiferent de acestea, încadrați calea în funcția XPath number().
  • Spațiile de nume declarate în document se înregistrează automat. Un spațiu de nume cu prefix (xmlns:dc="…") se folosește cu prefixul său; un spațiu de nume implicit (xmlns="…") primește numele elementului care îl declară — pentru <DIDL-Lite xmlns="…"> scrieți DIDL-Lite:container.
  • Documentele mai mici de 80 kB și expresiile compilate se păstrează în cache, așa că apelurile repetate asupra aceluiași răspuns sunt ieftine.

Exemplu — când răspunsul conține:

 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

Exemplu — XML cu spații de nume

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

Erori — PARSEXML - parse error: … (XML sau XPath nevalid).

Consultați și — SENDHTTPREQUEST, DECODE.