چگونگی تجزیه فایل XML در Xcode

یک کار ساده که ستون فقرات بسیاری از برنامه ها است توانایی تجزیه فایل های XML است. خوشبختانه، Xcode باعث می شود که فایل XML در Objective-C نسبتا آسان باشد.

یک فایل XML می تواند هر چیزی را از اطلاعات پایه ای درباره برنامه شما به یک خوراک RSS برای یک وب سایت داشته باشد. آنها همچنین می توانند راهی عالی برای به روز رسانی اطلاعات در برنامه شما از راه دور باشند، بنابراین دور زدن نیاز به ارسال یک باینری جدید به اپل به سادگی برای اضافه کردن یک آیتم جدید به یک لیست.

بنابراین چگونه فایل های XML را در Xcode پردازش می کنیم؟ این فرایند شامل مراحل برای مقداردهی اولیه متغیرهایی است که باید مورد استفاده قرار گیرد، شروع پردازش تجزیه کننده XML، تغذیه آن پروسه یک فایل، شروع یک عنصر فردی، کاراکتر (ارزش) درون عنصر، پایان یک عنصر فردی و پایان روند تجزیه و تحلیل.

در این مثال، یک پرونده از اینترنت را با یک آدرس وب خاص ( URL ) تجزیه می کنیم.

ما با ساختن فایل هدر شروع می کنیم. این یک مثال از یک فایل سرصفحه بسیار ساده برای یک کنترل کننده Detail View با حداقل الزامات برای تجزیه فایل ما است:

interface RootViewController: UITableViewController {
جزئیات DetailViewController * detailViewController؛

NSXMLParser * rssParser؛
NSMutableArray * مقالات
NSMutableDictionary * آیتم؛
NSString * currentElement؛
NSMutableString * ElementValue؛
BOOL errorParsing؛
}

property (nonatomic، حفظ) IBOutlet DetailViewController * detailViewController؛

- (void) parseXMLFileAtURL: (NSString *) URL؛

تابع parseXMLFileAtURL فرایند را برای ما آغاز می کند. هنگامی که آن را به اتمام برساند، مقالات "NSMutableArray" اطلاعات ما را نگه می دارد. آرایه از واژه نامه های قابل تغییر با کلیدهای مربوط به نام فیلد در فایل XML تشکیل شده است.

اکنون که متغیرهای مورد نیاز را تنظیم کرده ایم، ما به فرآیند در فایل MM حرکت خواهیم کرد.

- (void) parserDidStartDocument: (NSXMLParser *) تجزیه کننده {
NSLog (@ "فایل یافت شده و تجزیه آغاز شده")؛

}

این تابع در ابتدای فرایند اجرا می شود. نیازی نیست که چیزی در این تابع قرار دهید، اما اگر میخواهید یک کار را انجام دهید وقتی فایل شروع به تجزیه می شود، این کد شما را کد می کند.

- (void) parseXMLFileAtURL: (NSString *) URL
{

NSString * agentString = @ "Mozilla / 5.0 (Macintosh؛ U؛ Intel Mac OS X 10_5_6؛ en-us) AppleWebKit / 525.27.1 (KHTML، مانند Gecko) نسخه 3.2.1 Safari / 525.27.1"؛
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]]؛
[request setValue: agentString forHTTPHeaderField: @ "User-Agent"]؛
xmlFile = [NSURLConnection sendSynchronousRequest: درخواست returningResponse: خطای nil: nil]؛


مقالات = [[NSMutableArray تخصیص] init]؛
errorParsing = NO؛

rssParser = [[NSXMLParser alloc] initWithData: xmlFile]؛
[rssParser setDelegate: self]؛

// ممکن است لازم باشد بعضی از اینها را براساس نوع فایل XML که در حال تجزیه و تحلیل هستید، تغییر دهید
[rssParser setShouldProcessNamespaces: NO]؛
[rssParser setShouldReportNamespacePrefixes: NO]؛
[rssParser setShouldResolveExternalEntities: NO]؛

[rssParser تجزیه]؛

}

این تابع موتور را برای بارگیری یک فایل در یک آدرس وب (URL) مشخص می کند و روند تجزیه آن را آغاز می کند.

ما به سرور راه دور می گویم که ما Safari در Mac اجرا می شود فقط در صورتی که سرور تلاش می کند تا iPhone / iPad را به یک نسخه تلفن همراه هدایت کند.

گزینه های انتهایی خاصی برای برخی از فایل های XML هستند. اکثر فایل های RSS و فایل های XML عمومی به آنها نیازی ندارند.

- تجزیه کننده (void): (NSXMLParser *) تجزیه کننده parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "کد خطا٪ i"، [parseError code]]؛
NSLog (@ "خطا در تجزیه XML:٪ @"، errorString)؛


errorParsing = YES؛
}

این یک خطای ساده مسیریابی است که یک مقدار باینری را تنظیم می کند اگر خطایی را در بر دارد. بسته به اینکه چه کاری انجام می دهید، ممکن است به چیزی خاص تر در این مورد نیاز داشته باشید. اگر به سادگی نیاز به اجرای برخی از کد پس از پردازش در مورد خطا، متغیر باینری errorParsing را می توان در آن زمان نامیده می شود.

(NSString *) صفر qName: (NSDictionary *) attributeDict {(NSScripting *) attributeDict {
currentElement = [عنصر نام کپی]؛
ElementValue = [[NSMutableString alloc] init]؛
اگر ([elementName isEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] init]؛

}

}

گوشت تجزیه کننده XML شامل سه توابع است که در ابتدای یک عنصر فرد اجرا می شود، یکی که در طول وسط تجزیه عنصر اجرا می شود و دیگری که در انتهای عنصر اجرا می شود.

برای این مثال، ما یک فایل شبیه به فایل های RSS را تجزیه می کنیم که عناصر را به گروه های تحت عنوان "اقلام" در فایل XML تجزیه می کنند. در ابتدای پردازش، ما برای نام عنصر "مورد" و تخصیص فرهنگ لغت مورد ما هنگامی که یک گروه جدید شناسایی می شود بررسی می کنیم. در غیر این صورت، مقدار متغیر را برای مقدار اولیه می کنیم.

- (void) تجزیه کننده: (NSXMLParser *) تجزیه کننده یافت شده شخصیت: (NSString *) string {
[ElementValue appendString: رشته]؛
}

این بخش آسان است. وقتی شخصیت ها را پیدا می کنیم، آنها را به متغیر "ElementValue" اضافه می کنیم.

- (void) تجزیه کننده: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
اگر ([elementName isEqualToString: @ "item"]) {
[مقالات addObject: [آیتم کپی]]؛
} else {
[item setObject: ElementValue forKey: elementName]؛
}

}

هنگامی که پردازش یک عنصر را به پایان رسانده ایم، باید یکی از دو مورد را انجام دهیم: (1) اگر عنصر end "item" باشد، ما گروه ما را به پایان رسانده ایم، بنابراین ما فرهنگ لغت ما را به آرایه ای از "مقالات "

یا (2) اگر عنصر "مورد" نیست، ارزش را در دیکشنری ما با یک کلید که با نام عنصر مطابقت دارد تعیین می کنیم. (به این معنی که ما برای هر فیلد در فایل XML یک متغیر فردی نداریم. ما می توانیم آنها را کمی بیشتر به صورت پویا پردازش کنیم.)

- (void) parserDidEndDocument: (NSXMLParser *) تجزیه کننده {

اگر (errorParsing == NO)
{
NSLog (@ "پردازش XML انجام شده!")؛
} else {
NSLog (@ "خطا هنگام پردازش XML رخ داده است")؛
}

}

این آخرین تابع مورد نیاز برای روال تجزیه و تحلیل ما است. این سند به سادگی به پایان می رسد. شما هر كدی را كه میخواهید فرآیند را به پایان برسانید یا هر چیز خاصی كه ممكن است بخواهید در صورت خطا انجام دهید قرار دهید.

یکی از دلایلی که بسیاری از برنامه ها ممکن است بخواهند این کار را انجام دهند این است که داده ها و / یا فایل XML را به یک فایل در دستگاه ذخیره کنند. به این ترتیب، اگر کاربر بعدا بارگذاری برنامه را به اینترنت متصل نکنند، هنوز هم می توانند از این اطلاعات استفاده کنند.

البته، مهمترین بخش را نمی توانیم فراموش کنیم: درخواست برنامه شما برای تجزیه فایل (و دادن آن آدرس وب برای پیدا کردن آن در!).

برای شروع این فرآیند، شما فقط باید این خط کد را به جای مناسب که میخواهید پردازش XML انجام دهید اضافه کنید:

[self parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml"]؛