Perder o espaço em branco em torno de símbolos escapados em CDATA usando o analisador Expat XML em C ++
-
19-09-2019 - |
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 & spaces around&some & 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&spaces around&some&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".
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 & YYY
Eu recebo três eventos com o conjunto de dados char * e comprimento como Folows:
char * = "XXX & 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?