0

一部のサーバーからのphpクエリの結果として、xmlファイルを取得しています。結果のデータをコンソールに出力すると、適切に構造化された xml ファイルが得られます。NSXMLParser を使用して解析しようとすると、コード 4 - 空のドキュメントで NSXMLParserErrorDomain が返されます。解析できなかった xml には、xml ヘッダーの '>' マークを閉じた直後に BOM (バイト オーダー マーク) シーケンスがあることがわかりました。問題は、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 を正常に解析します。Safari はこれらの文字を無視します。だからXcodeデバッガ。助けてください!

ありがとう、

ナバ

4

3 に答える 3

0

まあ、これは BOM バイトを取り除く最良の方法ではないかもしれませんが、うまくいきます。私のように、BOM を飲み込むために NSXMLParser を作成しようと何時間も費やした人のために:

    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 を使用してパーサーを作成すると、すぐに機能します。このコードへのコメント/改善を喜んで受け取ります

于 2010-01-15T07:36:02.750 に答える
0

そのような 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 または ISOLatin1 として解釈する場合、文字列では 3 つの個別の文字として表示されます。これらの 3 つの別個の文字は、BOM である単一の文字と同等ではありません。

于 2010-01-16T08:14:57.987 に答える
0

これが問題であるかどうかはわかりません。ファイルが UTF-8 としてエンコードされた非常によく似た経験がありましたが、xml ヘッダーはそれが UTF-16 であると主張しました。

不一致の結果、同じエラーで解析できませんでした。ただし、xml ヘッダーを UTF-16 から UTF-8 に変更すると、問題が解決しました。

同様の問題が発生している可能性があります。

于 2010-01-14T18:31:48.683 に答える