Funkcje parsowania
Funkcje parsowania w skryptach TapHome — PARSETEXT dla tekstu między wzorcami, PARSEJSON z JSONPath i PARSEXML z XPath — do odczytu wartości z odpowiedzi urządzeń.
Funkcje parsowania odczytują wartości z tekstu, który zwraca urządzenie — zwykle z odpowiedzi na żądanie HTTP lub z odebranej wiadomości w skrypcie Packet parser. Przyjmują tekst, kolekcję bajtów (collection<uint8>) lub blob, działają w każdym skrypcie i wymagają Core 2022.2 lub nowszego.
PARSETEXT
PARSETEXT zwraca część tekstu, która następuje po lewym wzorcu i kończy się przed prawym wzorcem; gdy ta część jest liczbą, zwracana jest liczba.
| |
| Nazwa | Typ | Opis |
|---|---|---|
source | tekst, collection<uint8> lub blob | Przeszukiwany tekst. Bajty są odczytywane jako iso-8859-1. |
leftPattern | tekst | Tekst przed wartością. Kilka części oddzielonych ... jest wyszukiwanych jedna po drugiej. |
rightPattern | tekst, opcjonalny | Tekst po wartości. Bez niego wartość kończy się na pierwszym znaku, który nie jest literą, cyfrą ani . (początkowy + lub - zostaje zachowany). |
Zwraca — liczbę, gdy znaleziony tekst da się odczytać jako liczbę (z kropką dziesiętną), w przeciwnym razie tekst z obciętymi spacjami. Null, gdy lewy wzorzec nie zostanie znaleziony.
Gdy lewy wzorzec zostanie znaleziony, ale prawy nie, skrypt zatrzymuje się błędem Specified argument was out of the range of valid values. — nie zwraca
Null. Gdy prawego wzorca może brakować, najpierw sprawdź go przezINDEXOF(sprawdzone na Core 2026.1, kompilacja 40599).
Przykład
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: NullPrzykład — prawy wzorzec, którego może brakować
VAR start := INDEXOF(text, "temp=");
IF start < 0 OR INDEXOF(COPY(text, start), ";") < 0
RETURN(NaN);
END
PARSETEXT(text, "temp=", ";");PARSEJSON
PARSEJSON odczytuje wartość z JSON wyrażeniem JSONPath; z TRUE jako trzecim argumentem zwraca Null zamiast zatrzymać skrypt, gdy ścieżka nie zostanie znaleziona.
| |
| Nazwa | Typ | Opis |
|---|---|---|
json | tekst, collection<uint8> lub blob | Tekst JSON. |
path | tekst | JSONPath. Początkowe $. jest opcjonalne. |
ignoreError | bool, opcjonalny | TRUE (lub 1): zwróć Null, gdy ścieżka nie zostanie znaleziona, JSON jest nieprawidłowy lub json jest Null. Domyślnie FALSE. |
Zwraca — wartość pod ścieżką: tekst, liczbę lub bool. Kilka dopasowań zwracanych jest jako kolekcja. Obiekt lub tablica zwracane są jako ich tekst JSON, który można parsować ponownie.
| Ścieżka | Wybiera |
|---|---|
temperature, cloud.connected | Pole, zagnieżdżone pole. |
$.devices[0].name | Pole pierwszego elementu tablicy. |
$.devices[-1:].deviceId | Ostatni element tablicy. |
$[?(@.period == 1)].price | Elementy, których pole spełnia warunek. |
Przykład — gdy json zawiera:
| |
PARSEJSON(json, "firstName");
# Result: "John"
PARSEJSON(json, "address.city");
# Result: "Nara"
PARSEJSON(json, "age");
# Result: 26
PARSEJSON(json, "address.country", TRUE);
# Result: NullPARSEJSON(json, "address.country") bez trzeciego argumentu zatrzymuje skrypt błędem PARSEJSON - Element not found: ‘address.country’.
Przykład — pętla po tablicy JSON
Z TRUE funkcja PARSEJSON zwraca Null po ostatnim elemencie, co kończy pętlę:
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;Błędy — PARSEJSON - Element not found: ‘path’; PARSEJSON - parse error: … (nieprawidłowy JSON); PARSEJSON - argument 1 is null.
PARSEXML
PARSEXML odczytuje wartość z XML wyrażeniem XPath i zwraca wartość pierwszego pasującego węzła.
| |
Zwraca — wartość pierwszego węzła: liczbę, gdy tekst da się odczytać jako liczbę, w przeciwnym razie tekst; Null, gdy nic nie pasuje. Funkcje XPath zwracają własny wynik, na przykład liczbę z count().
Uwagi
- Liczby w tekście węzła są odczytywane zgodnie z ustawieniami językowymi jednostki sterującej. Aby odczytać liczbę z kropką dziesiętną niezależnie od nich, obejmij ścieżkę funkcją XPath
number(). - Przestrzenie nazw zadeklarowane w dokumencie są rejestrowane automatycznie. Przestrzeń nazw z prefiksem (
xmlns:dc="…") używa się z jej prefiksem; domyślna przestrzeń nazw (xmlns="…") dostaje nazwę elementu, który ją deklaruje — dla<DIDL-Lite xmlns="…">napiszDIDL-Lite:container. - Dokumenty mniejsze niż 80 kB i skompilowane wyrażenia są przechowywane w pamięci podręcznej, więc powtarzane wywołania na tej samej odpowiedzi są tanie.
Przykład — gdy odpowiedź zawiera:
| |
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: NullPrzykład — XML z przestrzeniami nazw
VAR xml := response.Content;
PARSEXML(xml, "//DIDL-Lite:container[dc:title='My Playlist']/DIDL-Lite:res");Błędy — PARSEXML - parse error: … (nieprawidłowy XML lub XPath).
Zobacz też — SENDHTTPREQUEST, DECODE.