TapHome

Funkce pro parsování

Funkce skriptu TapHome pro parsování — PARSETEXT pro text mezi vzory, PARSEJSON s JSONPath a PARSEXML s XPath — pro čtení hodnot z odpovědí zařízení.

Funkce pro parsování čtou hodnoty z textu, který vrací zařízení — typicky z odpovědi na požadavek HTTP nebo z přijaté zprávy ve skriptu Packet parser. Přijímají řetězec, kolekci bajtů (collection<uint8>) nebo blob, fungují v každém skriptu a vyžadují Core 2022.2 nebo novější.

PARSETEXT

PARSETEXT vrátí část textu, která následuje za levým vzorem a končí před pravým vzorem; když je ta část číslo, vrátí číslo.

1
2
PARSETEXT(source, leftPattern)
PARSETEXT(source, leftPattern, rightPattern)
NázevTypPopis
sourceřetězec, collection<uint8> nebo blobProhledávaný text. Bajty se čtou jako iso-8859-1.
leftPatternřetězecText před hodnotou. Více částí oddělených ... se hledá jedna po druhé.
rightPatternřetězec, nepovinnýText za hodnotou. Bez něj hodnota končí u prvního znaku, který není písmeno, číslice ani . (úvodní + nebo - zůstává).

Vrací — číslo, když nalezený text lze přečíst jako číslo (s desetinnou tečkou), jinak text s oříznutými mezerami. Null, když levý vzor není nalezen.

Když je levý vzor nalezen, ale pravý ne, skript se zastaví chybou Specified argument was out of the range of valid values. — nevrátí Null. Když pravý vzor může chybět, ověřte ho nejprve přes INDEXOF (ověřeno na Core 2026.1, build 40599).

Pří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

Příklad — pravý vzor, který může chybět

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

Viz také — INDEXOF, COPY.

PARSEJSON

PARSEJSON přečte hodnotu z JSON výrazem JSONPath; s TRUE jako třetím argumentem vrátí Null místo zastavení skriptu, když cesta není nalezena.

1
2
PARSEJSON(json, path)
PARSEJSON(json, path, ignoreError)
NázevTypPopis
jsonřetězec, collection<uint8> nebo blobText JSON.
pathřetězecJSONPath. Úvodní $. je volitelné.
ignoreErrorbool, volitelnýTRUE (nebo 1): vrátit Null, když cesta není nalezena, JSON je neplatný nebo json je Null. Výchozí FALSE.

Vrací — hodnotu na dané cestě: řetězec, číslo nebo bool. Více shod se vrátí jako kolekce. Objekt nebo pole se vrátí jako svůj text JSON, který lze znovu parsovat.

CestaVybere
temperature, cloud.connectedPoložka, vnořená položka.
$.devices[0].namePoložka prvního prvku pole.
$.devices[-1:].deviceIdPoslední prvek pole.
$[?(@.period == 1)].pricePrvky, jejichž položka splňuje podmínku.

Příklad — když 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 třetího argumentu zastaví skript chybou PARSEJSON - Element not found: ‘address.country’.

Příklad — procházení pole JSON v cyklu

S TRUE vrátí PARSEJSON za posledním prvkem Null, což cyklus ukončí:

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 přečte hodnotu z XML výrazem XPath a vrátí hodnotu prvního vyhovujícího uzlu.

1
PARSEXML(xml, xpath)

Vrací — hodnotu prvního uzlu: číslo, když text lze přečíst jako číslo, jinak řetězec; Null, když nic nevyhovuje. Funkce XPath vracejí vlastní výsledek, například číslo z count().

Poznámky

  • Čísla v textu uzlu se čtou podle jazykového nastavení řídicí jednotky. Chcete-li číslo s desetinnou tečkou přečíst nezávisle na něm, obalte cestu funkcí XPath number().
  • Jmenné prostory deklarované v dokumentu se registrují automaticky. Jmenný prostor s prefixem (xmlns:dc="…") se používá se svým prefixem; výchozí jmenný prostor (xmlns="…") dostane název prvku, který ho deklaruje — pro <DIDL-Lite xmlns="…"> pište DIDL-Lite:container.
  • Dokumenty menší než 80 kB a zkompilované výrazy se ukládají do mezipaměti, takže opakovaná volání nad stejnou odpovědí jsou levná.

Příklad — když odpověď 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

Příklad — XML se jmennými prostory

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

Chyby — PARSEXML - parse error: … (neplatné XML nebo XPath).

Viz také — SENDHTTPREQUEST, DECODE.