כיצד לנתח קבצי XML ב

משימה אחת פשוטה היא עמוד השדרה ליישומים רבים היא היכולת לנתח קבצי XML. ולמרבה המזל, Xcode עושה את זה קל יחסית לנתח קובץ XML Objective-C.

קובץ XML יכול להכיל דבר מהנתונים הבסיסיים על האפליקציה שלך לעדכון RSS עבור אתר אינטרנט. הם יכולים גם להיות דרך מצוינת לעדכן מידע בתוך האפליקציה שלך מרחוק, ובכך לעקוף את הצורך לשלוח בינארי חדש ל- Apple פשוט להוסיף פריט חדש לרשימה.

כיצד אנו מעבירים קובצי XML ב- Xcode? התהליך כולל שלבים לאתחול המשתנים שיש להשתמש בהם, הפעלת תהליך מנתח ה- XML, הזנת תהליך קובץ, תחילת אלמנט בודד, התווים (ערך) בתוך האלמנט, סוף אלמנט בודד, וסיום תהליך הניתוח.

בדוגמה זו, ננתח קובץ מהאינטרנט על ידי העברתו לכתובת אינטרנט מסוימת ( URL ).

נתחיל בבניית קובץ הכותרת. זוהי דוגמה לקובץ כותרת בסיסית מאוד עבור בקר הצג פרטים עם הדרישות המינימליות לנתח את הקובץ שלנו:

@ ממשק RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * מאמרים;
פריט NSMutableDictionary *;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

@property (nonatomic, לשמור) IBOutlet DetailViewController * detailViewController;

- (חלל) parseXMLFileAtURL: (NSString *) כתובת האתר;

הפונקציה parseXMLFileAtURL תתחיל את התהליך עבורנו. כאשר זה מסיים, את NSMutableArray "מאמרים" תקיים את הנתונים שלנו. המערך יהיה מורכב ממילונים משתנים עם מפתחות הקשורים לשמות השדות בקובץ ה- XML.

כעת, לאחר שהגדרנו את המשתנים הנדרשים, נעבור אל המפגש של התהליך בקובץ .m:

- (void) parserDidStartDocument: (NSXMLParser *) מנתח {
NSLog (@ "הקובץ נמצא וניתוח התחיל");

}

פונקציה זו פועלת בתחילת התהליך. אין צורך לשים משהו בפונקציה זו, אבל אם אתה רוצה לבצע משימה כאשר הקובץ מתחיל להיות מנותח, זה המקום שבו היית שם את הקוד שלך.

- (חלל) parseXMLFileAtURL: (NSString *) כתובת האתר
{

NTString * = "Mozilla / 5.0 (Macintosh, U, Intel Mac OS X 10_5_6; en-us) AppleWebKit / 525.27.1 (KHTML, כמו Gecko) גירסה / 3.2.1 ספארי / 525.27.1";
NSMutableURLRequest * request = [בקשה NSMutableURLRequestWithURL:
[NSURL URLWithString: URL]];
[request setValue: agentString forHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: request returnResponse: nil error: nil];


מאמרים = [[NSMutableArray הוקצה] init];
errorParsing = NO;

rssParser = [[NSXMLParser assign] initWithData: xmlFile];
[rssParser setDelegate: עצמי];

/ / ייתכן שיהיה עליך להפעיל חלק מהם על פי סוג של קובץ XML שאתה מנתח
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];

[rssParser לנתח];

}

פונקציה זו מורה למנוע להוריד קובץ בכתובת אינטרנט מסוימת (URL) ולהתחיל את תהליך ניתוחו.

אנו אומרים לשרת המרוחק שאנחנו ספארי הפועל ב- Mac רק במקרה השרת מנסה להפנות את iPhone / iPad לגירסה הניידת.

האפשרויות בסוף הן ספציפיות קבצי XML מסוימים. רוב קבצי RSS וקבצי XML גנריים לא צריך אותם מופעלים.

- (void) מנתח: (NSXMLParser *) מנתח parseErrorOccured: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "קוד שגיאה% i", [קוד parseError]];
NSLog (@ "שגיאה בניתוח XML:% @", errorString);


errorParsing = YES;
}

זוהי בדיקה פשוטה של ​​בדיקת שגיאות שתגדיר ערך בינארי אם היא תתקלה בשגיאה. ייתכן שיהיה עליך משהו ספציפי יותר כאן, תלוי מה אתה עושה. אם אתה פשוט צריך להפעיל כמה קוד לאחר עיבוד במקרה של שגיאה, משתנה בינארי ErrorParsing ניתן לקרוא באותו זמן.

- (NSString *) שם מרחב שמות (NSString) * (NSString *) תכונות QName: (NSDictionary *) featureDict {
currentElement = [elementName copy];
ElementValue = [[[NSMutableString הקצאה] init];
אם ([elementName isEqualToString: @ "item"]) {
פריט = [[NSMutableDictionary הקצאה] init];

}

}

הבשר של מנתח ה- XML ​​מכיל שלוש פונקציות, אחת הפועלות בתחילת אלמנט בודד, אחת שפועלת באמצע ניתוח האלמנט, ואחת שפועלת בקצה האלמנט.

בדוגמה זו, אנו ננתח קובץ הדומה לקבצי RSS המפרקים אלמנטים לקבוצות תחת הכותרת "פריטים" בתוך קובץ ה- XML. בתחילת העיבוד, אנו בודקים את שם האלמנט "פריט" ומקצים את מילון הפריט שלנו כאשר מזוהה קבוצה חדשה. אחרת, אנו מאתחלים את המשתנה שלנו עבור הערך.

- (Void) מנתח: (NSXMLParser *) מנתח נמצאו תווים: (NSString *) מחרוזת {
[ElementValue appendString: string];
}

זה החלק הקל. כאשר אנו מוצאים תווים, אנחנו פשוט להוסיף אותם המשתנה שלנו "ElementValue".

(nSString *) elementName שם מרחב: (NSString *) שם מרחב שמות מוסמך Name: (NSString *) qName {
אם ([elementName isEqualToString: @ "item"]) {
[מאמרים addObject: [עותק פריט]];
} else
[item setObject: ElementValue forKey: elementName];
}

}

כשסיימנו לעבד אלמנט, אנחנו צריכים לעשות אחד משני דברים: (1) אם אלמנט הסיום הוא "item", סיימנו את הקבוצה שלנו, לכן נוסיף את המילון שלנו למערך המאמרים שלנו ".

או (2) אם האלמנט אינו "פריט", נגדיר את הערך במילון שלנו עם מפתח התואם את שמו של האלמנט. (משמעות הדבר היא שאיננו זקוקים למשתנה אינדיבידואלי עבור כל שדה בתוך קובץ ה- XML, ואנו יכולים לעבד אותם באופן דינמי יותר).

- (חלל) parserDidEndDocument: (NSXMLParser *) מנתח {

אם (errorParsing == NO)
{
NSLog (@ "עיבוד XML נעשה!");
} else
NSLog (@ "אירעה שגיאה במהלך עיבוד XML");
}

}

זוהי הפונקציה האחרונה הדרושה לשגרת הניתוח שלנו. זה פשוט מסתיים את המסמך. תוכל לשים כל קוד שאתה רוצה לסיים את התהליך כאן או כל דבר מיוחד שאולי תרצה לעשות במקרה של שגיאה.

דבר אחד יישומים רבים עשויים לעשות כאן היא לשמור את הנתונים ו / או קובץ XML לקובץ על המכשיר. בדרך זו, אם המשתמש אינו מחובר לאינטרנט בפעם הבאה שהם מעמיסים את האפליקציה, הם עדיין יכולים לקבל מידע זה.

כמובן, אנחנו לא יכולים לשכוח את החלק החשוב ביותר: לספר את הבקשה שלך לנתח את הקובץ (ולתת לו כתובת אינטרנט כדי למצוא אותו!).

כדי להתחיל את התהליך, אתה פשוט צריך להוסיף את שורת הקוד למקום המתאים שבו אתה רוצה לעשות את עיבוד XML:

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