Question

Je reçois mon fichier xml à la suite d'une requête de php à partir un serveur. Lorsque j'imprime les données obtenues à la console que je reçois un fichier xml bien structuré. Lorsque je tente de l'analyser en utilisant NSXMLParser retourne NSXMLParserErrorDomain avec le code 4 - document vide. J'ai vu que xmls qu'il ne pouvait pas analyser avoir BOM séquence juste après la fermeture de marque « > » (Byte order mark) d'en-tête xml. La question est de savoir comment se débarrasser de la séquence de nomenclature. J'ai essayé de créer une chaîne avec les BOM octets comme ça:

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

mais il ne fonctionne pas pour une raison quelconque. Il y a xmls, qui ont cette séquence après l'élément racine. Dans ce cas NSXMLParser avec succès l'analyse xml. Safari ignore ces caractères. Alors débogueur Xcode. S'il vous plaît aider!

Merci,

Nava

Était-ce utile?

La solution

  

J'ai essayé de créer une chaîne avec les BOM octets comme ça:

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

mais il ne fonctionne pas pour une raison quelconque.

Assurez-vous que vous avez donné l'encodage correct lors de l'instanciation noBOMString. Si les données du document était UTF-8, assurez-vous instancié la chaîne en UTF-8. De même, si les données UTF-16, assurez-vous instancié la chaîne en UTF-16.

Si vous passez le mauvais encodage, que ce soit la chaîne n'instancier du tout (je suppose que ce n'est pas votre problème) ou certains personnages tort. La nomenclature serait l'un de ces: Si l'entrée est UTF-8 et vous interpréter comme MacRoman ou ISOLatin1, il va apparaître dans la chaîne en trois caractères distincts. Ces trois personnages distincts ne se comparent pas égal au caractère unique qui est la nomenclature.

Autres conseils

Je ne suis pas certain que ce soit la question. J'ai eu une expérience très similaire où le fichier a été codé en UTF-8, mais l'en-tête xml prétendais qu'il soit UTF-16.

En raison de la non-concordance Je n'a pas pu analyser avec la même erreur que vous aviez. Cependant, en changeant l'en-tête xml de UTF-16 en UTF-8 a fixé mon problème pour moi.

Vous pouvez être confronté à un problème similaire.

Eh bien, peut-être ce n'est pas la meilleure approche pour se débarrasser des octets de nomenclature, mais il fonctionne. Pour ceux qui ont passé des heures comme moi essayant de faire NSXMLParser à avaler BOM: Given, que vous obtenez vos données grâce NSURLConnection et le stocker dans 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];

Ensuite, vous créez votre analyseur avec newData et ça fonctionne! Je serai heureux d'obtenir des commentaires / améliorations à ce code

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top