Frage

Ich erhalte meine XML-Datei als Ergebnis einer PHP-Abfrage von einem Server. Wenn ich die resultierenden Daten an die Konsole drucke ich gut strukturierte XML-Datei immer bin. Wenn ich versuche, es zu analysieren NSXMLParser verwenden es gibt NSXMLParserErrorDomain mit Code 4 - leeres Dokument. Ich sah, dass xmls, dass es nicht analysieren kann BOM (Byte Order Mark) Sequenz direkt nach dem Schließen hat ‚>‘ Zeichen der XML-Header. Die Frage ist, wie die BOM-Sequenz loszuwerden. Ich habe versucht, eine Zeichenfolge zu schaffen, mit denen BOM wie die Bytes:

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

aber nicht aus irgendeinem Grund arbeiten. Es gibt xmls, dass diese Sequenz nach dem Stammelement aufweist. In diesem Fall analysiert NSXMLParser die XML erfolgreich. Safari ignoriert diese Zeichen. So Xcode Debugger. Bitte Hilfe!

Danke,

Nava

War es hilfreich?

Lösung

  

Ich habe versucht, eine Zeichenfolge zu schaffen, mit denen BOM wie die Bytes:

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

, aber es funktioniert nicht aus irgendeinem Grunde.

Stellen Sie sicher sind Sie auf die richtige Codierung, wenn noBOMString Instanziierung. Wenn die Dokumentdaten UTF-8 war, stellen Sie sicher, dass Sie die Zeichenfolge als UTF-8 instanziiert. Ebenso, wenn die Daten UTF-16 war, stellen Sie sicher, dass Sie die Zeichenfolge als UTF-16 instanziiert.

Wenn Sie die falsche Codierung übergeben, entweder die Zeichenfolge nicht instantiate überhaupt (ich gehe davon aus, dass nicht Ihr Problem) oder einige Zeichen falsch. Die BOM würde einer von diesen sein: Wenn die Eingabe UTF-8 und Sie es als MacRoman oder ISOLatin1 interpretieren, wird es in der Zeichenfolge als drei separate Zeichen erscheinen. Diese drei getrennten Zeichen werden nicht vergleichen gleich der einzelnen Zeichen, dass die BOM ist.

Andere Tipps

Ich bin nicht sicher, dass dies das Problem. Ich habe eine sehr ähnliche experiance habe, wo die Datei als UTF-8 codiert wurde, aber der XML-Header behauptete, es UTF-16 zu sein.

Als Folge des Ungleichgewichts war ich nicht in der Lage es mit dem gleichen Fehler zu analysieren Sie hatten. Um jedoch die XML-Header von UTF-16 auf UTF-8 festgelegt mein Problem für mich zu ändern.

Sie können ein ähnliches Problem auftreten.

Nun, kann dies nicht der beste Ansatz von BOM-Bytes, um loszuwerden, aber es funktioniert. Für diejenigen, die Stunden wie ich damit verbracht, NSXMLParser zu schlucken Stücklisten zu machen: In Anbetracht, dass Sie Ihre Daten durch NSURLConnection erhalten und speichern sie in 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];

Dann erstellen Sie Ihren Parser mit newData und es funktioniert einfach! Ich werde froh sein, irgendwelche Kommentare / Verbesserungen an diesem Code zu erhalten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top