2 Stimmen

Verlust von Leerzeichen um escapte Symbole in CDATA mit Expat XML Parser in C++

Ich verwende XML, um Projektinformationen zwischen Anwendungen zu übermitteln. Eine der Informationen ist die Projektbeschreibung. Ich habe also:

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

Oder: "Test & Räume um&some & Amps!" <-- GUT!

Wenn ich dann Expat verwende, um sie zu parsen, erhält mein Data Handler jeweils nur Teile der gesamten Zeichenfolge. "Test", dann "&", dann "Leerzeichen", das nächste "&", etc, etc. Wenn ich dann versuche, die ursprüngliche Zeichenfolge zu rekonstruieren, werden alle Abstände um die "&"s herum weggelassen, weil der Data Handler sie nie zu sehen bekommt. Wenn ich dann die XML neu schreibe, erhalte ich:

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

Oder: "Teste&Räume um&einige&Verstärker!" <-- SCHLECHT!

Ist dies ein bekanntes Problem, für das es bereits Abhilfen gibt? Gibt es eine Einstellung, die ich Expat geben kann, um sein Verhalten bei escapeten Symbolen zu steuern?

Meine Versuche, eine Antwort zu googeln, sind kläglich gescheitert.

EDIT: 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 in dem Element. Ohne "&" ist es die gesamte Zeichenkette zwischen den Tags "open" und "close", im Fall von "a string with spaces".

0 Stimmen

Aus Ihrem bearbeiteten Code sieht es so aus, als würden Sie den Längenparameter des Handlers nicht berücksichtigen.

0 Stimmen

Aha! Ich berücksichtige das schon, aber Ihr Kommentar hat mich dazu gebracht, mir einen Teil des Codes anzusehen, den ich für selbstverständlich hielt. Ich sollte es besser wissen, als den Code, den die Kollegen schreiben, für bare Münze zu nehmen! Vielen Dank für die Hilfe!

0 Stimmen

Was hat der Handler getan, um die Leerzeichen zu entfernen? Ich scheine vor dem gleichen Problem zu stehen, und der Handler-Code ist nicht von mir geschrieben. Jeder Vorschlag von Ihnen könnte also sehr nützlich sein. Vielen Dank!

0voto

Ich habe gerade einen Test mit meiner eigenen Bibliothek durchgeführt, die expat verwendet. Mein Handler sieht wie folgt aus, mit Debug-Anweisungen, um anzuzeigen, was vor sich geht:

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 kann das Verhalten, von dem Sie sprechen, nicht nachvollziehen. Für die Eingabedaten:

XXX &amp; YYY

Ich erhalte drei Ereignisse mit dem Datensatz char * und length wie folgt:

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

char * = "&"
length = 1

char * = " YYY"
length = 4

Die Leerzeichen werden also beibehalten. Soweit ich weiß, verwende ich keine besonderen Einstellungen. Welche Version und Plattform von Expat verwenden Sie?

0 Stimmen

Ich habe gerade auf expat-2.0.1 aus der tar.gz aktualisiert, die ich heute morgen von der Website erhalten habe, in der Hoffnung, dass das Problem in dieser Version behoben ist. Plattform ist Win32.

0 Stimmen

Ok, einige Code, der speziell auf meine dataHandler entfernt die Leerzeichen. Danke!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X