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ń.
Ostatnia aktualizacja:
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; wymagana wersja: Core 2022.2 lub nowszy.
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).
Przykład
# tekst między dwoma wzorcami
PARSETEXT("Lorem ipsum dolor sit amet", "ipsum", "amet");
# Result: "dolor sit"
PARSETEXT("<temp>12.2</temp>", "<temp>", "</temp>");
# Result: 12.2
# bez prawego wzorca wartość kończy się na pierwszym innym znaku
PARSETEXT("<temp>12.2</temp>", "<temp>");
# Result: 12.2
PARSETEXT("status:ok,error:none", "status:");
# Result: "ok"
# kilka lewych części, szukanych po kolei
PARSETEXT("Lorem ipsum dolor sit amet", "ipsum...sit");
# Result: "amet"
PARSETEXT("Lorem ipsum dolor sit amet consectetur adipiscing", "ipsum...sit", "adipiscing");
# Result: "amet consectetur"
# lewy wzorzec nie został znaleziony
PARSETEXT("a=1", "b=");
# Result: NullPrzykład — prawy wzorzec, którego może brakować
# pozycja lewego wzorca
VAR start := INDEXOF(text, "temp=");
# koniec, gdy brakuje prawego wzorca
IF start < 0 OR INDEXOF(COPY(text, start), ";") < 0
RETURN(NaN);
END
# odczyt wartości między wzorcami
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:
| |
# pole na najwyższym poziomie
PARSEJSON(json, "firstName");
# Result: "John"
# pole zagnieżdżone
PARSEJSON(json, "address.city");
# Result: "Nara"
PARSEJSON(json, "age");
# Result: 26
# brakująca ścieżka zwraca Null, bez błędu
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ę:
# licznik pętli i zebrane nazwy
VAR i := 0;
VAR names := "";
# nazwa pierwszego elementu tablicy
VAR name := PARSEJSON(json, "$.devices[0].name", TRUE);
WHILE !ISNULL(name)
names := names + name + "\n";
i := i + 1;
# nazwa następnego elementu
name := PARSEJSON(json, "$.devices[" + TOSTRING(i) + "].name", TRUE);
LOOP
# zwraca zebrane nazwy
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:
| |
# treść odpowiedzi jako tekst XML
VAR xml := response.Content;
# tytuł drugiej książki
PARSEXML(xml, "//book[2]/title");
# Result: "Midnight Rain"
# wartość atrybutu
PARSEXML(xml, "//book[1]/@id");
# Result: "bk101"
# number() odczytuje cenę jako liczbę z kropką dziesiętną
PARSEXML(xml, "number(//catalog/book[1]/price)");
# Result: 44.95
# count() zwraca liczbę pasujących węzłów
PARSEXML(xml, "count(//book)");
# Result: 2
# brak dopasowania zwraca Null
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.