TapHome

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.

1
2
PARSETEXT(source, leftPattern)
PARSETEXT(source, leftPattern, rightPattern)
NameTypBeschreibung
sourceString, collection<uint8> oder BlobZu durchsuchender Text. Bytes werden als iso-8859-1 gelesen.
leftPatternStringText vor dem Wert. Mehrere durch ... getrennte Teile werden nacheinander gesucht.
rightPatternString, optionalText 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 Null zurück. Wenn das rechte Muster fehlen kann, prüfen Sie es zuerst mit INDEXOF (ü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: Null

Beispiel — 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=", ";");

Siehe auch — INDEXOF, COPY.

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.

1
2
PARSEJSON(json, path)
PARSEJSON(json, path, ignoreError)
NameTypBeschreibung
jsonString, collection<uint8> oder BlobJSON-Text.
pathStringJSONPath. Das führende $. ist optional.
ignoreErrorbool, optionalTRUE (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.

PfadWählt aus
temperature, cloud.connectedEin Feld, ein verschachteltes Feld.
$.devices[0].nameEin Feld des ersten Array-Elements.
$.devices[-1:].deviceIdDas letzte Element eines Arrays.
$[?(@.period == 1)].priceElemente, deren Feld eine Bedingung erfüllt.

Beispiel — wenn json Folgendes enthält:

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

1
PARSEXML(xml, xpath)

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

 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

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