Pregunta

Me estoy poniendo mi archivo XML como resultado de una consulta php desde algún servidor. Al imprimir los datos resultantes para la consola me estoy archivo XML bien estructurado. Cuando trato de analizarlo usando NSXMLParser vuelve NSXMLParserErrorDomain con código de 4 - vacío documento. Vi que XMLs que no pudo analizar tener BOM (Byte marca de orden) secuencia correcta después de cerrar '>' marca de la cabecera XML. La cuestión es cómo deshacerse de la secuencia de la lista de materiales. Intenté crear una cadena con los bytes de la lista de materiales así:

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

pero no funciona por alguna razón. Hay XMLs, que tienen esta secuencia después de que el elemento raíz. En este caso NSXMLParser analiza el éxito xml. Safari hace caso omiso de esos caracteres. Así depurador de Xcode. Por favor, ayuda!

Gracias,

Nava

¿Fue útil?

Solución

  

He intentado crear una cadena con los bytes de la lista de materiales así:

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

pero no funciona por alguna razón.

Asegúrese de que usted dio la codificación correcta cuando una instancia de noBOMString. Si los datos del documento era UTF-8, asegúrese de que haya instanciado la cadena como UTF-8. Del mismo modo, si los datos eran UTF-16, asegúrese de que haya instanciado la cadena como UTF-16.

Si pasa la codificación incorrecta, o bien la cadena no va a crear una instancia en absoluto (estoy asumiendo que no es su problema) o algunos caracteres serán incorrectas. La lista de materiales sería uno de los siguientes: Si la entrada es UTF-8 y se interpretan como MacRoman o ISOLatin1, que va a aparecer en la cadena como tres personajes diferentes. Estos tres personajes separados no compararán igual a la de un solo carácter, que es la lista de materiales.

Otros consejos

No estoy seguro de que esta es la cuestión. He tenido una experiencia muy similar en el que el archivo fue codificado como UTF-8, pero la cabecera xml reclamado que sea UTF-16.

Como resultado de la falta de correspondencia he podido analizarlo con el mismo error que había. Sin embargo, el cambio de la cabecera xml de UTF-16 a UTF-8 fijo mi problema para mí.

Usted puede estar experimentando un problema similar.

Bueno, puede ser que esto no es el mejor método para deshacerse de bytes de lista de materiales, pero funciona. Para los que pasaba horas como yo tratando de hacer NSXMLParser de tragar listas de materiales: Teniendo en cuenta, que obtiene sus datos a través de NSURLConnection y lo almacena en 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];

A continuación, se crea el programa de análisis con newData y simplemente funciona! Me alegraré de conseguir cualquier comentario / mejoras en el código

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top