Perder o espaço em branco em torno de símbolos escapados em CDATA usando o analisador Expat XML em C ++

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

Pergunta

Estou usando o XML para enviar informações do projeto entre aplicativos. Uma das informações é a descrição do projeto. Então eu tenho:

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

Ou: "Teste e espaços ao redor e alguns e amplificadores!" <- bom!

Quando uso o expat para analisá -lo, meu manipulador de dados recebe apenas partes de toda a string por vez. "Teste", então "&", então "espaços em torno", o próximo "e", etc., etc. Quando tento reconstruir a string original, todo o espaçamento em torno do & é descartado porque o manipulador de dados nunca chega a vê-los. Quando reescrevo o XML, recebo:

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

Ou: "Teste e espaços ao redor e alguns!" <- ruim!

Isso é um problema conhecido com soluções alternativas existentes? Existe alguma configuração que eu possa dar o expat para controlar seu comportamento em torno dos símbolos escapados?

Minhas tentativas de pesquisar uma resposta no Google encontraram fracasso sombrio.

EDIT: Em resposta a uma pergunta nos comentários: Eu tenho meu próprio manipulador, que registro no analisador:

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

O manipulador é declarado da seguinte maneira:

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

E então "S" contém os dados no elemento. Sem qualquer coisa, é a sequência inteira entre as tags abertas e fechadas, no caso de "uma string with spaces".

Foi útil?

Solução

Acabei de executar um teste com minha própria biblioteca que usa o expat. Meu manipulador se parece com isso, com declarações de depuração para exibir o que está acontecendo:

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

Não vejo o comportamento de que você está falando. Para os dados de entrada:

XXX &amp; YYY

Eu recebo três eventos com o conjunto de dados char * e comprimento como Folows:

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

char * = "&"
length = 1

char * = " YYY"
length = 4

Portanto, os espaços são retidos. Até onde eu sei, não estou usando nenhuma configuração específica. Qual versão e plataforma do expat você está usando?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top