سؤال

أحصل على ملف XML الخاص بي نتيجة لاستعلام PHP من بعض الخادم. عندما أقوم بطباعة البيانات الناتجة إلى وحدة التحكم ، أحصل على ملف XML منظم جيدًا. عندما أحاول تحليله باستخدام NSXMLParser ، فإنه يعيد NSXMLParserRordomain مع الكود 4 - وثيقة فارغة. لقد رأيت أن XMLs أنه لا يمكن تحليل تسلسل BOM (علامة بايت) مباشرة بعد الإغلاق ">" علامة XML رأس. والسؤال هو كيفية التخلص من تسلسل 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:@" "];

لكنه لا يعمل لسبب ما. هناك XMLs ، التي لديها هذا التسلسل بعد عنصر الجذر. في هذه الحالة ، تقوم NSXMLParser بتوزيع XML بنجاح. Safari يتجاهل تلك الشخصيات. حتى Xcode تصحيح الأخطاء. الرجاء المساعدة!

شكرًا،

نافا

هل كانت مفيدة؟

المحلول

حاولت إنشاء سلسلة مع تلك البايتات من هذا القبيل:

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 أو arsoleatin1 ، فسيظهر في السلسلة كثلاثة أحرف منفصلة. لن تقارن هذه الأحرف الثلاثة المنفصلة مع الحرف الواحد الذي هو BOM.

نصائح أخرى

لست متأكدًا من أن هذه هي القضية. لقد أجريت تجربة مماثلة للغاية حيث تم ترميز الملف على أنه UTF-8 ، لكن رأس XML ادعى أنه UTF-16.

نتيجة لعدم التوافق ، لم أتمكن من تحليله بنفس الخطأ الذي كان لديك. ومع ذلك ، فإن تغيير رأس XML من UTF-16 إلى UTF-8 إصلاح مشكلتي بالنسبة لي.

قد تواجه مشكلة مماثلة.

حسنًا ، قد يكون هذا ليس أفضل طريقة للتخلص من بايت بوم ، ولكنها تعمل. بالنسبة لأولئك الذين قضوا ساعات مثلي في محاولة لجعل NSXMLParser لابتلاع BOMs: معطى ، تحصل على بياناتك من خلال NSURLCONNECTION وتخزينها في NSMUTABLETATA *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