Tenez j'ai retrouvé mon test et j'ai adapté le code de test à votre XML
Je mets en PJ la bibliothèque modifiée - les modifications sont décrites dans le LisezMoi (mal écrit d'ailleurs dans le ZIP
)
Librairie venant de GitHub - adafruit/TinyXML: Fork of Adam Rudd's (adamvr) TinyXML library
Modifiée par &J-M-L https://forum.arduino.cc/index.php?action=profile;u=438300
car buggy
Dans le .cpp
J'ai viré tous les pgm_read_word
Dans le .h
j'ai changé les types qui étaient uint8_t en int16_t pour
int16_t LTCount;
int16_t tagCount;
(Car ils sont testés pour voir s'ils deviennent négatifs ce qui est impossible en non signé)
le code pour tester:
/*
Copyright (c) 2020 J-M-L https://forum.arduino.cc/index.php?action=profile;u=438300
Author : J-M-L
Create Time : May 2020
Change Log :
The MIT License (MIT)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
USING LIBRARIES (c) their own authors. See their terms and conditions
TinyXML.h https://github.com/adafruit/TinyXML
*/
#include <TinyXML.h> // https://github.com/adafruit/TinyXML
TinyXML xml;
uint8_t xmlBuffer[150]; // For XML decoding
const char testDocument[] = "<root><element>7</element></root>";
void XMLParser(uint8_t statusflag, char* nameBuffer, uint16_t namebuflen, char* dataBuffer, uint16_t databuflen)
{
Serial.print(F("XMLParser Status= "));
switch (statusflag) {
case STATUS_START_TAG: Serial.print(F("STATUS_START_TAG")); break;
case STATUS_TAG_TEXT: Serial.print(F("STATUS_TAG_TEXT")); break;
case STATUS_ATTR_TEXT: Serial.print(F("STATUS_ATTR_TEXT")); break;
case STATUS_END_TAG: Serial.print(F("STATUS_END_TAG")); break;
case STATUS_ERROR: Serial.print(F("STATUS_ERROR")); break;
}
if (namebuflen) {
Serial.print(F(" Name= "));
Serial.print(nameBuffer);
}
if (databuflen) {
Serial.print(F(" data = "));
Serial.print(dataBuffer);
}
Serial.println();
const char* etiquetteInteressante = "/root/element";
if ((statusflag == STATUS_TAG_TEXT) && !strcasecmp(nameBuffer, etiquetteInteressante)) {
Serial.print(F("J'ai trouvé ")); Serial.print(etiquetteInteressante);
Serial.print(F(" qui vaut '")); Serial.print(dataBuffer); Serial.println(F("'"));
}
}
void setup()
{
Serial.begin(115200);
xml.init(xmlBuffer, sizeof(xmlBuffer), &XMLParser);
Serial.println(F("\n*** DEBUT XML Parser ***"));
for (const char* p = testDocument; *p; p++) {
xml.processChar(*p); // feed the beast
}
xml.reset(); // for next time
Serial.println(F("\n*** FIN XML Parser ***\n"));
}
void loop() {}
le moniteur série (à 115200 bauds) affichera
[color=purple]
*** DEBUT XML Parser ***
XMLParser Status= STATUS_START_TAG Name= /root
XMLParser Status= STATUS_START_TAG Name= /root/element
XMLParser Status= STATUS_TAG_TEXT Name= /root/element data = 7
[color=red]J'ai trouvé /root/element qui vaut '7'
[/color]XMLParser Status= STATUS_END_TAG Name= /root/element
XMLParser Status= STATUS_END_TAG Name= /root
*** FIN XML Parser ***
[/color]
---> on voit bien donc que le call back est appelé à des moment opportuns et que j'ai pu trouver (en rouge) la valeur 7.
Pour extraire vos données (7 ici) il faut attendre un statusflag
de type STATUS_TAG_TEXT
, que le tag corresponde à celui recherché (ici '/root/element') et extraire avec un atoi() par exemple la valeur dans dataBuffer
je n'ai pas poussé très loin les tests pour voir la robustesse au dépassement mémoire etc....
TinyXML.zip (6.66 KB)