La pérdida de espacio en blanco alrededor de los símbolos escapó en CDATA usando analizador de Expat XML en C ++

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

Pregunta

Estoy usando XML para enviar la información del proyecto entre las aplicaciones. Una de las piezas de información es la descripción del proyecto. Así que tengo:

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

O: "Prueba y espacios alrededor y algunos y amplificadores!"

Cuando a continuación, expat El uso analizarlo, mi manejador de datos se pone sólo partes de la cadena entera a la vez. "Prueba", después "y", y luego "espacios alrededor", el siguiente "y", etc, etc. Cuando luego tratar de reconstruir la cadena original, todo el espacio alrededor de la & 's se ha caído debido a que el manejador de datos nunca llega a verlas. Cuando vuelva a escribir el código XML consigo:

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

O: "Prueba y espacios alrededor y algunos y amplificadores!"

¿Es un problema conocido con soluciones existentes? ¿Hay un cierto ajuste que puedo dar expatriados para controlar su comportamiento en torno a símbolos escapado?

Mis intentos de buscar en Google una respuesta se han reunido con fracaso total.

EDIT: En respuesta a una pregunta en los comentarios: Tengo mi propio manejador, que me registro con el analizador:

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

El manejador se declara como sigue:

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

Y a continuación, "s" contiene los datos del elemento. Sin ningún tipo de material y, es la cadena completa entre las etiquetas de apertura y cierre, en el caso de "una cadena con espacios".

¿Fue útil?

Solución

acabo de realizar una prueba con mi propia biblioteca que utiliza expatriados. Mi manejador tiene este aspecto, con instrucciones de depuración para mostrar lo que está pasando:

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

No veo el comportamiento que está hablando. Para los datos de entrada:

XXX &amp; YYY

consigo tres eventos con los datos de longitud y * Juego de caracteres como folows:

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

char * = "&"
length = 1

char * = " YYY"
length = 4

Así que los espacios se conservan. Por lo que yo sé que no estoy usando cualquier configuración specal. ¿Qué versión y plataforma de expatriados está usando?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top