TapHome

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.

1
2
PARSETEXT(source, leftPattern)
PARSETEXT(source, leftPattern, rightPattern)
NazwaTypOpis
sourcetekst, collection<uint8> lub blobPrzeszukiwany tekst. Bajty są odczytywane jako iso-8859-1.
leftPatterntekstTekst przed wartością. Kilka części oddzielonych ... jest wyszukiwanych jedna po drugiej.
rightPatterntekst, opcjonalnyTekst 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 przez INDEXOF (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: Null

Przykł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=", ";");

Zobacz też — INDEXOF, COPY.

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.

1
2
PARSEJSON(json, path)
PARSEJSON(json, path, ignoreError)
NazwaTypOpis
jsontekst, collection<uint8> lub blobTekst JSON.
pathtekstJSONPath. Początkowe $. jest opcjonalne.
ignoreErrorbool, opcjonalnyTRUE (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żkaWybiera
temperature, cloud.connectedPole, zagnieżdżone pole.
$.devices[0].namePole pierwszego elementu tablicy.
$.devices[-1:].deviceIdOstatni element tablicy.
$[?(@.period == 1)].priceElementy, których pole spełnia warunek.

Przykład — gdy json zawiera:

 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"
  }
}
# 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: Null

PARSEJSON(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.

1
PARSEXML(xml, xpath)

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="…"> napisz DIDL-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:

 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>
# 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: Null

Przykł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.