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

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

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

תהליך ה- Xcode

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

השתמש בניתוח XML

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

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

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;
NSXMLParser * rssParser;
NSMutableArray * מאמרים;
instagram viewer

פריט NSMutableDictionary *;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}
@property (nonatomic, retain) IBOutlet DetailViewController * detailViewController;
- (void) parseXMLFileAtURL: (NSString *) URL;


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

לאחר מכן, אתחל את התהליך:

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

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

להנחות את התוכנית להוריד משהו

לאחר מכן, הנח את התוכנית להוריד משהו:

- (void) parseXMLFileAtURL: (NSString *) URL
{
NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; אינטל Mac OS X 10_5_6; en-us) AppleWebKit / 525.27.1 (KHTML, כמו Gecko) גרסה / 3.2.1 Safari / 525.27.1 ";
NSMutableURLRequest * בקשה = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[בקשת setValue: agentString forHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: בקשת החזרת תגובה: שגיאת אפס: אפס];
מאמרים = [[NSMutableArray alloc] init];
errorParsing = NO;
rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[rssParser setDelegate: עצמי];
// יתכן שתצטרך להפוך חלק מאלה בהתאם לסוג קובץ ה- XML ​​שאתה מנתח
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];
[rssParser parse];
}


פונקציה זו מורה למנוע להוריד קובץ בכתובת אינטרנט מסוימת (URL) ולהתחיל בתהליך הניתוח שלו. אנו אומרים לשרת המרוחק שאנחנו ספארי שמריץ ב- Mac למקרה שהשרת ינסה להפנות את ה- iPhone / iPad לגרסה ניידת.

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

שגיאה - בדוק את התוצאה

בצע בדיקת שגיאות בסיסית בתוצאה:

- (ריק) מנתח: (NSXMLParser *) מנתח parseErrorOccurred: (NSError *) parseError {
NSString * errorString = [NSString stringWithFormat: @ "קוד שגיאה% i", [קוד parseError]];
NSLog (@ "שגיאה בניתוח XML:% @", errorString);
errorParsing = כן;
} ניתוב בדיקת שגיאות זה מגדיר ערך בינארי אם הוא נתקל בשגיאה. יתכן שתזדקק למשהו ספציפי יותר כאן, תלוי במה שאתה עושה. אם אתה פשוט צריך להפעיל קוד כלשהו לאחר העיבוד במקרה של שגיאה, ה-


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

ניתוח התוכן שאוחזר

לאחר מכן, התוכנית מפרקת את התוכן שאוחזר ומנתחת אותו:

- (חלל) מנתח: (NSXMLParser *) מנתח didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI כשם: (NSString *) תכונות qName: (NSDictionary *) attributeDict {
currentElement = [העתק elementName];
ElementValue = [[הקצאת NSMutableString] init];
אם ([elementName isEqualToString: @ "item"]) {
פריט = [[NSMutableDictionary הקצאה] init];
}
}


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

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

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


כאשר אנו מוצאים תווים, אנו פשוט מוסיפים אותם למשתנה שלנו ElementValue:

- (ריק) מנתח: (NSXMLParser *) מנתח didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI כשם: (NSString *) qName {
אם ([elementName isEqualToString: @ "item"]) {
[מאמרים addObject: [העתק פריט]];
} אחר {
[פריט setObject: ElementValue forKey: elementName];
}
}

מה שקורה כאשר הניתוח הושלם

כאשר התוכנית מסיימת לעבד אלמנט, עליה לעשות אחד משני דברים:

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

זו הפונקציה האחרונה הדרושה לשגרת הניתוח שלנו; זה מסיים את המסמך. שים כאן כל קוד סופי או ציין תת-דרך לתיקון שגיאות:

- (void) parserDidEndDocument: (NSXMLParser *) מנתח {
אם (errorParsing == NO)
{
NSLog (@ "עיבוד XML נעשה!");
} אחר {
NSLog (@ "אירעה שגיאה במהלך עיבוד XML");
}
}

שמור את הנתונים

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

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

 [עצמית ניתוח XMLFileAtURL: @ " http://www.webaddress.com/file.xml"];