---
title: "Funkcje parsowania"
description: "Parsowanie w skryptach TapHome: wycięcie wartości między dwoma wzorcami przez PARSETEXT, odczyt JSON przez PARSEJSON i XML przez PARSEXML oraz obsługa brakujących wartości."
url: "https://taphome.com/pl/docs/script/parsing-functions/"
language: pl
lastmod: 2026-11-06
generator: hugo
ai:
  topics: ["parsing","json","xml","text-extraction","scripting-language"]
  questions: ["Jak parsować dane JSON w skrypcie TapHome?","Jak wyodrębnić wartość z XML w TapHome?","Jak wyciąć tekst między dwoma wzorcami przez PARSETEXT?","Jak odczytać zagnieżdżone pole JSON przez ścieżkę JSON?","Jak obsłużyć brakujące elementy przy parsowaniu JSON?","Jak parsować XML zawierający przestrzenie nazw?","Dlaczego PARSETEXT zatrzymuje skrypt błędem „Specified argument was out of the range of valid values”?","Jak przejść pętlą po tablicy JSON w skrypcie 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: 2026-11-06

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](https://taphome.com/pl/docs/script/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.

```text
PARSETEXT(source, leftPattern)
PARSETEXT(source, leftPattern, rightPattern)
```

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

> [!WARNING]
> 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**

```taphome
# 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ć**

```taphome
# 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](https://taphome.com/pl/docs/script/text-string-and-byte-array/#indexof), [COPY](https://taphome.com/pl/docs/script/text-string-and-byte-array/#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.

```text
PARSEJSON(json, path)
PARSEJSON(json, path, ignoreError)
```

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

```json
{
  "firstName": "John",
  "lastName": "Doe",
  "age": 26,
  "address": {
    "streetAddress": "Naist street",
    "city": "Nara",
    "postalCode": "630-0192"
  }
}
```

```taphome
# 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ę:

```taphome
# 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.

```text
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:

```xml
<?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>
```

```taphome
# 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**

```taphome
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](https://taphome.com/pl/docs/script/packet-parser/#sendhttprequest), [DECODE](https://taphome.com/pl/docs/script/data-type-conversions/#decode).
