문제

일부 서버에서 PHP 쿼리의 결과로 XML 파일을 가져오고 있습니다. 결과 데이터를 콘솔에 인쇄하면 구조화 된 XML 파일이 잘 나타납니다. NSXMLPARSER를 사용하여 구문 분석하려고하면 코드 4- 빈 문서로 NSXMLPARSERRORDOMAIN을 반환합니다. 구문 분석 할 수없는 XMLS는 XML 헤더의 '>'마크를 닫은 직후에 BOM (Byte Order Mark) 시퀀스를 가질 수 있음을 알았습니다. 문제는 BOM 시퀀스를 제거하는 방법입니다. 나는 그와 같은 BOM 바이트로 문자열을 만들려고 노력했습니다.

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

그러나 그것은 어떤 이유로 작동하지 않습니다. 루트 요소 다음 에이 시퀀스가있는 XML이 있습니다. 이 경우 NSXMLPARSER는 XML을 성공적으로 구문 분석합니다. 사파리는 그 캐릭터를 무시합니다. 그래서 Xcode 디버거. 도와주세요!

감사,

해군

도움이 되었습니까?

해결책

나는 그와 같은 BOM 바이트로 문자열을 만들려고 노력했습니다.

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

그러나 그것은 어떤 이유로 작동하지 않습니다.

인스턴스화 할 때 올바른 인코딩을 제공해야합니다 noBOMString. 문서 데이터가 UTF-8 인 경우 문자열을 UTF-8으로 인스턴스화해야합니다. 마찬가지로 데이터가 UTF-16 인 경우 문자열을 UTF-16으로 인스턴스화해야합니다.

잘못된 인코딩을 전달하면 문자열이 전혀 인스턴스화되지 않거나 (문제가 아니라고 가정합니다) 일부 문자가 잘못 될 것입니다. BOM은 다음 중 하나 일 것입니다. 입력이 UTF-8이고이를 MacRoman 또는 Irolatin1로 해석하면 문자열에 세 개의 개별 문자로 나타납니다. 이 세 가지 별도의 문자는 BOM 인 단일 문자와 동일하지 않습니다.

다른 팁

이것이 문제인지 확실하지 않습니다. 파일이 UTF-8으로 인코딩 된 매우 유사한 경험이 있었지만 XML 헤더는 UTF-16이라고 주장했습니다.

불일치의 결과로 나는 당신이 가진 것과 같은 오류로 그것을 구문 분석 할 수 없었습니다. 그러나 XML 헤더를 UTF-16에서 UTF-8로 변경하면 문제가 해결되었습니다.

비슷한 문제가 발생할 수 있습니다.

글쎄, 이것이 BOM 바이트를 제거하는 최선의 접근법이 아닐 수도 있지만 작동합니다. NSXMLPARSER를 만들려고 시간을 보냈던 사람들은 BOMS를 삼키기 위해 : NSURLConnection을 통해 데이터를 얻고 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];

그런 다음 NewData로 파서를 만들면 작동합니다! 이 코드에 대한 의견/개선 사항을 얻게되어 기쁩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top