Perdre des espaces autour des symboles échappé dans CDATA en utilisant un analyseur XML Expat en C ++

StackOverflow https://stackoverflow.com/questions/1900160

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 &amp; spaces around&amp;some  &amp;  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&amp;spaces around&amp;some&amp;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 ».

Était-ce utile?

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 &amp; YYY

Je reçois trois événements avec les données char * et longueur définies comme folows:

char * = "XXX &amp; 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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top