Domanda

I ricevo la mia file XML come un risultato di una query PHP da parte di alcuni server. Quando stampo i dati risultanti alla console mi sto file XML ben strutturato. Quando cerco di analizzarlo usando NSXMLParser ritorna NSXMLParserErrorDomain con il codice di 4 - Documento vuoto. Ho visto che XMLs che non poteva analizzare avere BOM (Byte order mark) sequenza di destra dopo la chiusura '>' segno di intestazione xml. La domanda è: come sbarazzarsi di sequenza di BOM. Ho cercato di creare una stringa con quelli BOM byte così:

    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:@" "];

, ma non funziona per qualche motivo. Ci sono XMLs, che hanno questa sequenza dopo l'elemento radice. In questo caso NSXMLParser analizza il successo xml. Safari ignora quei personaggi. debugger così Xcode. Si prega di aiutare!

Grazie,

Nava

È stato utile?

Soluzione

  

Ho cercato di creare una stringa con quelli BOM byte così:

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:@" "];
     

, ma non funziona per qualche motivo.

Assicurati che ti ha dato la codifica corretta quando si crea un'istanza noBOMString. Se i dati del documento è UTF-8, assicuratevi di istanziato la stringa come UTF-8. Allo stesso modo, se i dati sono stati UTF-16, assicurarsi che si istanziato la stringa come UTF-16.

Se si passa la codifica sbagliata, o la stringa non istanziare affatto (sto supponendo che non è il vostro problema) oppure alcuni caratteri sarà sbagliato. La distinta base sarebbe uno di questi: Se l'ingresso è UTF-8 e si interpreta come MacRoman o ISOLatin1, questa viene visualizzata nella stringa di tre caratteri distinti. Questi tre personaggi separati non metterà a confronto uguale al singolo carattere che è la distinta base.

Altri suggerimenti

Io non sono sicuro che questo è il problema. Ho avuto un experiance molto simile in cui il file è stato codificato come UTF-8, ma l'intestazione xml sostenuto di essere UTF-16.

A seguito della mancata corrispondenza sono stato in grado di analizzare con lo stesso errore che aveva. Tuttavia, cambiando l'intestazione XML da UTF-16 a UTF-8 fissa il mio problema per me.

Potrebbe trattarsi di un problema simile.

Bene, potrebbe essere questo non è l'approccio migliore per sbarazzarsi di byte BOM, ma funziona. Per coloro che hanno trascorso ore come me cercando di fare NSXMLParser da inghiottire distinte componenti: Dato, che si ottiene attraverso i dati NSURLConnection e conservarla nello 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];

Quindi si crea il parser con newData e funziona proprio! Sarò felice di ottenere qualsiasi commento / miglioramenti a questo codice

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top