Perdre des espaces autour des symboles échappé dans CDATA en utilisant un analyseur XML Expat en C ++
-
19-09-2019 - |
Question
J'utilise XML pour envoyer des informations entre les applications projet. L'un des éléments d'information est la description du projet. J'ai donc:
<ProjectDescription>Test & spaces around&some & amps!</ProjectDescription>
Ou: "Test et espaces autour et quelques amplis &!" <- BON
Quand je l'utilise ensuite Expat pour analyser, mon gestionnaire de données obtient juste une partie de la chaîne entière à la fois. « Test », puis « & », puis « espaces autour », le prochain « & », etc, etc. Lorsque je tente alors de reconstituer la chaîne d'origine, tout l'espace autour du & 's est abandonné car le gestionnaire de données ne fait jamais à les voir. Quand je puis re-écrire le XML que je reçois:
<ProjectDescription>Test&spaces around&some&amps!</ProjectDescription>
Ou: "Test et espaces autour et quelques amplis &!" <- BAD
Est-ce un problème connu avec des solutions de contournement existantes? Est-il un arrangement que je peux donner Expat pour contrôler son comportement autour des symboles échappées?
Mes tentatives de recherche sur Google une réponse ont rencontré un échec lamentable.
EDIT: En réponse à une question dans les commentaires: J'ai mon propre gestionnaire, que j'enregistrer avec l'analyseur:
parser=XML_ParserCreate(NULL);
XML_SetUserData(parser,&depth);
XML_SetElementHandler(parser,startElement,endElement);
XML_SetCharacterDataHandler(parser,dataHandler);
Le gestionnaire est déclarée comme suit:
static void dataHandler(void *userData,const XML_Char *s,int l)
Et puis « s » contient les données dans l'élément. Sans & choses, c'est la chaîne entière entre les balises ouvrir et fermer, dans le cas de « une chaîne avec des espaces ».
La solution
J'ai couru juste un test avec ma propre bibliothèque qui utilise expat. Mon gestionnaire ressemble à ceci, avec des instructions de débogage pour afficher ce qui se passe:
void CharDataHandler( void * parser,
const XML_Char *s,
int len ) {
std::cerr << "[" << s << "]\n";
std::cerr << len << "\n";
// my own processing here - not important
}
Je ne vois pas le comportement que vous parlez. Pour les données d'entrée:
XXX & YYY
Je reçois trois événements avec les données char * et longueur définies comme folows:
char * = "XXX & YYY"
length = 4
char * = "&"
length = 1
char * = " YYY"
length = 4
Ainsi, les espaces sont conservés. Pour autant que je sais que je ne suis pas en utilisant les paramètres specal. Quelle est la version et la plate-forme d'Expat utilisez-vous?