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

Foi útil?

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

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