Nsxmlparser e Bom Bytes
-
20-09-2019 - |
Pergunta
Estou recebendo meu arquivo XML como resultado de uma consulta PHP de algum servidor. Ao imprimir os dados resultantes para o console, estou recebendo arquivo XML bem estruturado. Quando tento analisá -lo usando nsxmlParser, ele retorna nsxmlParSerRordOnAin com o Código 4 - Documento vazio. Vi que XMLs não poderia analisar a sequência Bom (Byte Order Mark) logo após fechar a marca '>' do cabeçalho XML. A questão é como se livrar da sequência BOM. Eu tentei criar uma string com aqueles bytes de Bom como esse:
const UInt8 bom[3] = {0xEF, 0xBB, 0xBF};
NSString *bomString = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bom length:3] encoding:NSUTF8StringEncoding];
NSString *noBOMString = [theResult stringByReplacingOccurrencesOfString:bomString withString:@" "];
Mas não funciona por algum motivo. Existem XMLs, que têm essa sequência após o elemento raiz. Nesse caso, o NSXMLPARSER analisa o XML com sucesso. Safari ignora esses personagens. Então Xcode Debugger. Por favor ajude!
Obrigado,
Nava
Solução
Eu tentei criar uma string com aqueles bytes de Bom como esse:
const UInt8 bom[3] = {0xEF, 0xBB, 0xBF}; NSString *bomString = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bom length:3] encoding:NSUTF8StringEncoding]; NSString *noBOMString = [theResult stringByReplacingOccurrencesOfString:bomString withString:@" "];
Mas não funciona por algum motivo.
Certifique -se de dar a codificação correta ao instantar noBOMString
. Se os dados do documento foram UTF-8, certifique-se de instanciar a string como UTF-8. Da mesma forma, se os dados foram UTF-16, certifique-se de instanciar a string como UTF-16.
Se você passar na codificação errada, a string não instanciará (estou assumindo que esse não é o seu problema) ou alguns caracteres estarão errados. O BOM seria um deles: se a entrada for UTF-8 e você o interpretar como MacRoman ou Isolatin1, ele aparecerá na string como três caracteres separados. Esses três caracteres separados não se comparam iguais ao caractere único que é o BOM.
Outras dicas
Não tenho certeza de que esse é o problema. Eu tive uma experiência muito semelhante em que o arquivo foi codificado como UTF-8, mas o cabeçalho XML alegou que era UTF-16.
Como resultado da incompatibilidade, não consegui analisá -lo com o mesmo erro que você teve. No entanto, alterar o cabeçalho XML de UTF-16 para UTF-8 corrigiu meu problema para mim.
Você pode estar enfrentando um problema semelhante.
Bem, pode ser que essa não seja a melhor abordagem para se livrar dos Bom Bytes, mas funciona. Para aqueles que passaram horas como eu tentando fazer do NSXMLPARSER engolir BOMs: Dado, você obtém seus dados através do NSURLConnection e o armazenam no NSMutableData *webdata.
const char bom[3] = {0xEF, 0xBB, 0xBF};
char *data = [webData mutableBytes];
char *cp = data, *pp;
long lessBom = 0;
do {
cp = strstr((const char *)cp, (const char *)bom);
if (cp) {
pp = cp;
cp += 3;
memcpy(pp, cp, strlen(cp));
lessBom += 3;
}
} while (cp != NULL);
NSMutableData *newData = [[NSMutableData alloc] initWithBytes:data length:webData.length - lessBom];
Então você cria seu analisador com o NewData e ele apenas funciona! Ficarei feliz em obter comentários/melhorias neste código