Verlieren von Whitespace um entkommene Symbole in CDATA unter Verwendung des Expat XML -Parsers in C ++

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

Frage

Ich verwende XML, um Projektinformationen zwischen Anwendungen zu senden. Eine der Informationen ist die Projektbeschreibung. Also habe ich:

<ProjectDescription>Test &amp; spaces around&amp;some  &amp;  amps!</ProjectDescription>

Oder: "Test & Spaces Around & einige & Amps!" <- Gut!

Wenn ich dann expat analysiert habe, erhält mein Datenhandler gleichzeitig Teile der gesamten Zeichenfolge. "Test", dann "&", dann "Spaces Around", das nächste "&" usw. usw. Wenn ich dann versuche, die ursprüngliche Zeichenfolge zu rekonstruieren Sehen Sie sie. Wenn ich dann den XML neu schreibe, bekomme ich:

<ProjectDescription>Test&amp;spaces around&amp;some&amp;amps!</ProjectDescription>

Oder: "Test & Spaces Around & einige & S!" <- schlecht!

Ist dies ein bekanntes Problem mit vorhandenen Problemumgehungen? Gibt es eine Einstellung, die ich Expat geben kann, um sein Verhalten um entkommene Symbole zu kontrollieren?

Meine Versuche, eine Antwort zu googeln, haben sich mit düsteren Scheitern gestoßen.

Bearbeiten: Als Antwort auf eine Frage in den Kommentaren: Ich habe meinen eigenen Handler, den ich beim Parser registriere:

parser=XML_ParserCreate(NULL); 
XML_SetUserData(parser,&depth);
XML_SetElementHandler(parser,startElement,endElement); 
XML_SetCharacterDataHandler(parser,dataHandler); 

Der Handler wird wie folgt deklariert:

static void dataHandler(void *userData,const XML_Char *s,int l) 

Und dann enthält "s" die Daten im Element. Ohne & Zeug ist es die gesamte Zeichenfolge zwischen den offenen und engen Tags, im Fall von "eine Zeichenfolge mit Leerzeichen".

War es hilfreich?

Lösung

Ich habe gerade einen Test mit meiner eigenen Bibliothek durchgeführt, die Expat verwendet. Mein Handler sieht so aus, mit Debug -Aussagen, um anzuzeigen, was los ist:

void CharDataHandler( void * parser, 
                       const XML_Char *s,
                       int len ) {
    std::cerr << "[" << s << "]\n";
    std::cerr << len << "\n";
    // my own processing here - not important 
}

Ich sehe nicht das Verhalten, über das Sie sprechen. Für die Eingabedaten:

XXX &amp; YYY

Ich erhalte drei Veranstaltungen mit dem Datensatz von Char * und Länge als Laut:

char * = "XXX &amp; YYY"
length = 4

char * = "&"
length = 1

char * = " YYY"
length = 4

Die Räume bleiben also erhalten. Soweit ich weiß, verwende ich keine speziellen Einstellungen. Welche Version und Plattform von Expat verwenden Sie?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top