Zeichenkette bestimmten Text auslesen

Hallo Leute,

nach einiger Zeit beschäftige ich mich mal wieder ein bisschen mit meinem NodeMCU und ich steh mal wieder auf dem Schlauch.

Ich bekomme über MQTT eine längere Zeichenkette geschickt, die nicht immer den exakt gleichen Inhalt hat.

Hier ein Beispiel:

<scheduletableentry scid="FP_01" inithour="8" bkid="bk4" timeprocessing="2" maxdelay="60" timeframe="1" fromhour="0" tohour="23" hour="8" minute="20" starthour="8" startminute="10" via="über" remark="ziel" trainid="RE4" platform="4a" from="bk8" lcid="Taurus" lcbkid="bk9"/>

Nun möchte ich überprüfen ob z.B. folgende Wörter vorkommen und diese dann auslesen:

via="über"
 hour="8"

was sich ändert ist der Inhalt zwischen den " "

Anscheinend sehe ich gerade den Wald vor lauter Bäumen nicht und bitte euch um Hilfe.

Probiert habe ich z.B.

int Suche = messageTemp.indexOf("via"); 
  Serial.print("Position via: "); 
  Serial.println(Suche);

  Serial.print("String von via bis zum Ende: ");      
  Serial.println(messageTemp.substring(Suche, messageTemp.length()));

da bekomme ich aber ja alles was ab via kommt gefiltert

Position via: 230
String von via bis zum Ende: via="über" remark="ziel" trainid="RE4" platform="4a" from="bk8" lcid="Taurus" lcbkid="bk9"/>
  <scheduletableentry scid="FP_01_copy" inithour="8" bkid="bk5" timeprocessing="2" maxdelay="60" timeframe="1" fromhour="0" tohour="23" hour="8" minute="25" starthour="8" startminute="15" via="Ziel3, ueber3" remark="" trainid="RE4" platform="5a" from="bk8"/>
  <scheduletableentry scid="FP_01" inithour="9" bkid="bk4" timeprocessing="2" maxdelay="60" timeframe="1" fromhour="0" tohour="23" hour="9" minute="20" starthour="9" startminute="10" via="über" remark="ziel" trainid="RE4" platform="4a" from="bk8" delay="0" lcid="" lcbkid=""/>
  <scheduletableentry scid="FP_01_copy" inithour="9" bkid="bk5" timeprocessing="2" maxdelay="60" timeframe="1" fromhour="0" tohour="23" hour="9" minute="25" starthour="9" startminute="15" via="Ziel3, ueber3" remark="" trainid="RE4" platform="5a" from="bk8" delay="0" lcid="" lcbkid=""/>
</scheduletable>

haben möchte ich ja aber nur den Text innerhalb von " " nach via, also in diesem Fall den Text über der aber verschiedene Längen haben kann.

Vielen Dank schonmal

Torsten

Edit:

Hier der gesamte gesendete Text:

<scheduletable id="NEW2" hour="8" minute="13">
  <scheduletableentry scid="FP_01" inithour="8" bkid="bk4" timeprocessing="2" maxdelay="60" timeframe="1" fromhour="0" tohour="23" hour="8" minute="20" starthour="8" startminute="10" via="über" remark="ziel" trainid="RE4" platform="4a" from="bk8" lcid="Taurus" lcbkid="bk9"/>

a)
poste mal ein vollständiges xml das du da bekommst.

b)

 Serial.print("String von via bis zum Ende: ");      
  Serial.println(messageTemp.substring(Suche, messageTemp.length()));

naja du liest bis zum ENDE. Ermittle zunächst das vorkommen von via=" (deine Startposition)
und dann die Position des nächsten " (ab startposition + 5) das ist dann deine Endposition
und dann mach den substring von Startposition+5 bis Endposition
dann sollte nur mehr der Inhalt über übrigbleiben

Habe ich oben ergänzt.

Da ich gleich für den Rest des Tages unterwegs bin, werde ich morgen mal deinen Ansatz in Angriff nehmen.

Danke
Gruß Torsten

quick'n'dirty

//https://forum.arduino.cc/t/zeichenkette-bestimmten-text-auslesen/1145828
// 2023-07-08 by noiasca
// 

String messageTemp = R"=====(
<scheduletableentry scid="FP_01" inithour="8" bkid="bk4" timeprocessing="2" maxdelay="60" timeframe="1" fromhour="0" tohour="23" hour="8" minute="20" starthour="8" startminute="10" via="über" remark="ziel" trainid="RE4" platform="4a" from="bk8" lcid="Taurus" lcbkid="bk9"/>
)=====";


void extract() {
  uint16_t startpos = messageTemp.indexOf("via=") + 5; // länge von via + = + "
  uint16_t endpos = messageTemp.indexOf('"', startpos);
  Serial.print("startpos via: ");  Serial.println(startpos);
  Serial.print("endpos:"); Serial.println(endpos);

  Serial.print("String von via bis zur Endpos: ");
  Serial.println(messageTemp.substring(startpos, endpos));
}

void setup() {
 Serial.begin(115200);
 extract();
}

void loop() {
  // put your main code here, to run repeatedly:
}
1 Like

@noiasca

vielen Dank, das Hilft mir auf jeden Fall weiter.

Werde es morgen dann weiter ausbauen

Gruß Torsten

** OT **

Hallo noiasca

Wie nennt man die von dir angewandte Methode der String-Bearbeitung?

verstehe deine Frage nicht wirklich.
Ist ja nur indexOf und substring ...

Wenn es denn unbedingt auf zwei Worte reduziert werden muss

"Subzeichenkette extrahieren"?

"Teilstring ausschneiden"?

Teilstringpositionsbestimmung?

Eine funktionelle Beschreibung was der Code macht wäre:
bestimme in der Gesamtzeichenkette die Anfangsposition der gesuchten Teilzeichenkette
bestimme in der Gesamtzeichenkette die Position an der die gesuchte Teilzeichenkette endet.
Kopiere aus der Gesamtzeichenkette die Teilzeichenkette durch angeben von Anfangs- und Endposition heraus.

vgs

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.