Parsing-Funktionen
Parsing-Funktionen der TapHome-Skripte — PARSETEXT für Text zwischen Mustern, PARSEJSON mit JSONPath und PARSEXML mit XPath — zum Auslesen von Werten aus Geräteantworten.
Parsing-Funktionen lesen Werte aus Text, den ein Gerät zurückgibt — typischerweise die Antwort auf eine HTTP-Anfrage oder eine empfangene Nachricht in einem Packet-Parser-Skript. Sie akzeptieren einen String, eine Bytesammlung (collection<uint8>) oder einen Blob, funktionieren in jedem Skript und erfordern Core 2022.2 oder neuer.
PARSETEXT
PARSETEXT gibt den Teil eines Textes zurück, der auf ein linkes Muster folgt und vor einem rechten Muster endet; ist dieser Teil eine Zahl, wird eine Zahl zurückgegeben.
| |
| Name | Typ | Beschreibung |
|---|---|---|
source | String, collection<uint8> oder Blob | Zu durchsuchender Text. Bytes werden als iso-8859-1 gelesen. |
leftPattern | String | Text vor dem Wert. Mehrere durch ... getrennte Teile werden nacheinander gesucht. |
rightPattern | String, optional | Text nach dem Wert. Ohne ihn endet der Wert am ersten Zeichen, das kein Buchstabe, keine Ziffer und kein . ist (ein führendes + oder - bleibt erhalten). |
Rückgabewert — eine Zahl, wenn sich der gefundene Text als Zahl lesen lässt (mit Dezimalpunkt), sonst der Text ohne umgebende Leerzeichen. Null, wenn das linke Muster nicht gefunden wird.
Wird das linke Muster gefunden, das rechte aber nicht, hält das Skript mit dem Fehler Specified argument was out of the range of valid values. an — es gibt nicht
Nullzurück. Wenn das rechte Muster fehlen kann, prüfen Sie es zuerst mitINDEXOF(überprüft auf Core 2026.1, Build 40599).
Beispiel
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: NullBeispiel — rechtes Muster, das fehlen kann
VAR start := INDEXOF(text, "temp=");
IF start < 0 OR INDEXOF(COPY(text, start), ";") < 0
RETURN(NaN);
END
PARSETEXT(text, "temp=", ";");PARSEJSON
PARSEJSON liest einen Wert aus JSON mit einem JSONPath-Ausdruck; mit TRUE als drittem Argument gibt es Null zurück, statt das Skript anzuhalten, wenn der Pfad nicht gefunden wird.
| |
| Name | Typ | Beschreibung |
|---|---|---|
json | String, collection<uint8> oder Blob | JSON-Text. |
path | String | JSONPath. Das führende $. ist optional. |
ignoreError | bool, optional | TRUE (oder 1): Null zurückgeben, wenn der Pfad nicht gefunden wird, das JSON ungültig ist oder json gleich Null ist. Standard FALSE. |
Rückgabewert — der Wert am Pfad: ein String, eine Zahl oder ein bool. Mehrere Treffer werden als Sammlung zurückgegeben. Ein Objekt oder ein Array wird als sein JSON-Text zurückgegeben, der erneut geparst werden kann.
| Pfad | Wählt aus |
|---|---|
temperature, cloud.connected | Ein Feld, ein verschachteltes Feld. |
$.devices[0].name | Ein Feld des ersten Array-Elements. |
$.devices[-1:].deviceId | Das letzte Element eines Arrays. |
$[?(@.period == 1)].price | Elemente, deren Feld eine Bedingung erfüllt. |
Beispiel — wenn json Folgendes enthält:
| |
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") ohne drittes Argument hält das Skript mit PARSEJSON - Element not found: ‘address.country’ an.
Beispiel — Schleife über ein JSON-Array
Mit TRUE gibt PARSEJSON nach dem letzten Element Null zurück, was die Schleife beendet:
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;Fehler — PARSEJSON - Element not found: ‘path’; PARSEJSON - parse error: … (ungültiges JSON); PARSEJSON - argument 1 is null.
PARSEXML
PARSEXML liest einen Wert aus XML mit einem XPath-Ausdruck und gibt den Wert des ersten passenden Knotens zurück.
| |
Rückgabewert — der Wert des ersten Knotens: eine Zahl, wenn sich der Text als Zahl lesen lässt, sonst ein String; Null, wenn nichts passt. XPath-Funktionen geben ihr eigenes Ergebnis zurück, zum Beispiel eine Zahl aus count().
Hinweise
- Zahlen im Knotentext werden gemäß den Spracheinstellungen der Steuereinheit gelesen. Um eine Zahl unabhängig davon mit Dezimalpunkt zu lesen, schließen Sie den Pfad in die XPath-Funktion
number()ein. - Im Dokument deklarierte Namensräume werden automatisch registriert. Ein Namensraum mit Präfix (
xmlns:dc="…") wird mit seinem Präfix verwendet; ein Standardnamensraum (xmlns="…") erhält den Namen des Elements, das ihn deklariert — für<DIDL-Lite xmlns="…">schreiben SieDIDL-Lite:container. - Dokumente kleiner als 80 kB und kompilierte Ausdrücke werden zwischengespeichert, sodass wiederholte Aufrufe auf dieselbe Antwort wenig kosten.
Beispiel — wenn die Antwort Folgendes enthält:
| |
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: NullBeispiel — XML mit Namensräumen
VAR xml := response.Content;
PARSEXML(xml, "//DIDL-Lite:container[dc:title='My Playlist']/DIDL-Lite:res");Fehler — PARSEXML - parse error: … (ungültiges XML oder XPath).
Siehe auch — SENDHTTPREQUEST, DECODE.