Hallo my_xy_projekt,
interessante Antwort. Aha -- hm -- . Jetzt würde ich gerne ernsthaft dazulernen. Wirklich ernsthaft.
Ich wollte nun wirklich nicht jemanden persönlich an(zu)*****
Welchen Textabschnitt interpretierst du als "an(zu)***** " ? ? Da bin ich wohl blind auf beiden Augen und habe Asperger-Syndrom
@Tommy:
Ich bin dabei einen entsprechenden Parser speziell für das vom TO geposteten XML-String zu erstellen.
Siehe code unten. Das ist ein frühes Alpha-Stadium compiliert und spuckt den gesuchten Teilstring "3.00000" aus.
Die Qualität dieses Codes genügt noch lange nicht meinen persönlichen Ansprüchen die er erfüllen muss wenn ich ihn
auf GitHub hochlade. Und ich würde ihn auch ganz bestimmt nicht XML-parser nennen. Das würde viel zu hohe Ewartungen wecken die der code nicht erfüllt.
Der Code ist weder aufgeräumt noch auf Übersichtlichkeit getrimmt. Man muss ausserdem noch sehr gründlich prüfen welche Variablität die empfangen XML-Strings (die der TO bei seiner Abfragen empfängt) haben können und ob mein code mit dieser Variabilität richtig umgehen kann.
Schon klar wenn man versteht wie man TinyXML benutzt dann kann TinyXML alle XML-Daten die der Spezifikation entsprechen parsen und das passende zurückliefern.
#include <PString.h>
char XML_Str_AoC[1024] = " ";
PString XML_Str_PS(XML_Str_AoC, sizeof(XML_Str_AoC));
char XML_SubStr_AoC[1024] = " ";
PString XML_SubStr_PS(XML_SubStr_AoC, sizeof(XML_SubStr_AoC));
char Value_AoC[64] = " ";
PString Value_PS(Value_AoC, sizeof(Value_AoC));
char IDStr_AoC[64] = "=";
PString IDStr_PS(IDStr_AoC, sizeof(IDStr_AoC));
char Separator_AoC[64] = "=";
PString Separator_PS(Separator_AoC, sizeof(Separator_AoC));
unsigned long IDPos;
unsigned long ValuePos;
unsigned long EndOfValuePos;
unsigned long StrLen;
unsigned long BeginOfSubStr (char* p_PointerToSource, char* p_PointerToSubStr) {
unsigned long result = strstr(p_PointerToSource,p_PointerToSubStr) - p_PointerToSource;
return result;
}
unsigned long EndOfSubStr (char* p_PointerToSource, char* p_PointerToSubStr) {
unsigned long result = strstr(p_PointerToSource,p_PointerToSubStr) - p_PointerToSource + strlen(p_PointerToSubStr);
return result;
}
// my personal naming-convention parameter of functions start with prefix "p_"
void ExtractUntilSeparator(char* p_PointerToTarget, char* p_PointerToSeparator, char* p_PointerToSource)
{
Serial.println("entering ExtractUntilSeparator");
unsigned int LengthUntilDelimiter = strstr(p_PointerToSource,p_PointerToSeparator) - p_PointerToSource + 1;
strlcpy(p_PointerToTarget,p_PointerToSource,LengthUntilDelimiter);
Serial.print("p_PointerToSource:>#");
Serial.print(p_PointerToSource);
Serial.println("#");
Serial.print("p_PointerToTarget:>#");
Serial.print(p_PointerToTarget);
Serial.println("#");
Serial.print("p_PointerToSeparator:>#");
Serial.print(p_PointerToSeparator);
Serial.println("#");
Serial.println("leaving ExtractUntilSeparator");
}
// my personal naming-convention parameter of functions start with "p_"
void ExtractValueBehindSeparator(char* p_PointerToTarget, char* p_PointerToSeparator, char* p_PointerToSource)
{
Serial.println("entering ExtractValueBehindSeparator");
unsigned int PosOfSeparatorEnd = strstr(p_PointerToSource,p_PointerToSeparator) - p_PointerToSource + strlen(p_PointerToSeparator);
// if separatorstring was found
if (PosOfSeparatorEnd < strlen(p_PointerToSource) )
{
Serial.print("PosOfSeparatorEnd:>#");
Serial.print(PosOfSeparatorEnd);
Serial.println("#");
unsigned int NoOfBytesUntilEoString = strlen (p_PointerToSource) - PosOfSeparatorEnd + 1;
strlcpy(p_PointerToTarget, p_PointerToSource + PosOfSeparatorEnd, NoOfBytesUntilEoString);
}
else
{
p_PointerToTarget = ""; // if no separator was found there is nothing behind the separator
}
Serial.print("p_PointerToSource:>#");
Serial.print(p_PointerToSource);
Serial.println("#");
Serial.print("p_PointerToTarget:>#");
Serial.print(p_PointerToTarget);
Serial.println("#");
Serial.print("p_PointerToSeparator:>#");
Serial.print(p_PointerToSeparator);
Serial.println("#");
Serial.println("leaving ExtractValueBehindSeparator");
}
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println("setup-Start");
XML_Str_PS += "HTTP/1.0 200 OK ";
XML_Str_PS += "Content-Type: text/xml ";
XML_Str_PS += "Access-Control-Allow-Origin: * ";
XML_Str_PS += "X-Frame-Options: SAMEORIGIN ";
XML_Str_PS += "X-Content-Type-Options: nosniff ";
XML_Str_PS += "X-XSS-Protection: 1; mode=block ";
XML_Str_PS += "X-Robots-Tag: none ";
XML_Str_PS += "X-Download-Options: noopen ";
XML_Str_PS += "X-Permitted-Cross-Domain-Policies: none ";
XML_Str_PS += "Referrer-Policy: no-referrer ";
XML_Str_PS += "Content-Length: 300 ";
XML_Str_PS += "Connection: close ";
XML_Str_PS += "Date: Fri, 19 Jun 2020 20:20:38 GMT ";
XML_Str_PS += "<?xml version='1.0' encoding='ISO-8859-1' ?><systemVariables><systemVariable name='Grube Stand' variable='3.000000' value='3.000000' value_list='' value_text='' ise_id='2632' min='0' max='65000' unit='cm' type='4' subtype='0' timestamp='1592598038' value_name_0='' value_name_1=''/></systemVariables>";
Serial.print("XML_Str_PS#");
Serial.print(XML_Str_PS);
Serial.print("#");
Serial.println();
IDStr_PS = "'Grube Stand'";
Serial.print("1: IDStr_PS#");
Serial.print(IDStr_PS);
Serial.print("#");
Serial.println();
IDPos = BeginOfSubStr(XML_Str_PS,IDStr_PS);
Serial.print("IDPos:");
Serial.print(IDPos);
Serial.print("#");
Serial.println();
IDStr_PS = "value_list=";
Serial.print("2:IDStr_PS#");
Serial.print(IDStr_PS);
Serial.print("#");
Serial.println();
ValuePos = BeginOfSubStr(XML_Str_AoC,IDStr_AoC);
Serial.print("XML_Str_PS#");
Serial.print(XML_Str_PS);
Serial.print("#");
Serial.println();
Serial.print("ValuePos:");
Serial.print(ValuePos);
Serial.print("#");
Serial.println();
StrLen = ValuePos - IDPos;
Serial.print("StrLen:");
Serial.print(StrLen);
Serial.print("#");
Serial.println();
//Grube Stand' variable='3.000000' value='3.000000'
strncpy(XML_SubStr_PS, XML_Str_PS + IDPos, StrLen);
Serial.print("SubStr#");
Serial.print(XML_SubStr_PS);
Serial.print("#");
Serial.println();
XML_Str_PS = XML_SubStr_PS;
Separator_PS = "value='";
IDPos = EndOfSubStr(XML_SubStr_PS,Separator_PS);
Serial.print("3: IDPos:");
Serial.print(IDPos);
Serial.print("#");
Serial.println();
StrLen = strlen(XML_Str_PS) - IDPos + 1;
Serial.print("StrLen:");
Serial.print(StrLen);
Serial.print("#");
Serial.println();
strncpy(XML_SubStr_PS, XML_Str_PS + IDPos, StrLen);
Serial.print("SubStr#");
Serial.print(XML_SubStr_PS);
Serial.print("#");
Serial.println();
XML_Str_PS = XML_SubStr_PS;
Separator_PS = "'";
ExtractUntilSeparator(XML_SubStr_PS, Separator_PS, XML_Str_PS);
Serial.print("value SubStr#");
Serial.print(XML_SubStr_PS);
Serial.print("#");
Serial.println();
}
void loop() {
}
ursprüngich hattee ich ziemlich viele Kommentare drin. ABer dann komme ich über das Limit von 9000 Zeichen.
Deshalb die Code-Version mit Kommentaren im Anhang.
viele Grüße Stefan
PString-XML-Parser-002-Test.zip (2.08 KB)