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ń.

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.

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

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

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"
  }
}
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 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.

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>
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

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.