งานง่ายๆที่เป็นหัวใจสำคัญของแอพพลิเคชันจำนวนมากคือความสามารถในการแยกวิเคราะห์ไฟล์ XML และโชคดีที่ Xcode ทำให้ง่ายต่อการแยกวิเคราะห์ไฟล์ XML ใน Objective-C
ไฟล์ XML สามารถมีอะไรจากข้อมูลพื้นฐานเกี่ยวกับแอปของคุณไปยังฟีด RSS สำหรับเว็บไซต์ นอกจากนี้ยังสามารถเป็นวิธีที่ยอดเยี่ยมในการอัปเดตข้อมูลภายในแอปของคุณจากระยะไกลโดยไม่จำเป็นต้องส่งไบนารีใหม่ไปยังแอปเปิ้ลเพียงเพื่อเพิ่มรายการใหม่ลงในรายการ
เราจะประมวลผลไฟล์ XML ใน Xcode อย่างไร? กระบวนการนี้ประกอบด้วยขั้นตอนสำหรับการเริ่มต้นตัวแปรที่จะใช้การเริ่มต้นกระบวนการแยกวิเคราะห์ XML การป้อนข้อมูลกระบวนการแฟ้มแฟ้มเริ่มต้นของแต่ละองค์ประกอบอักขระ (ค่า) ภายในองค์ประกอบส่วนท้ายของแต่ละองค์ประกอบและจุดสิ้นสุด ของกระบวนการแยกวิเคราะห์
ในตัวอย่างนี้เราจะแยกวิเคราะห์ไฟล์จากอินเทอร์เน็ตโดยส่งที่อยู่เว็บหนึ่ง ๆ (URL)
เราจะเริ่มต้นด้วยการสร้างไฟล์ส่วนหัว นี่คือตัวอย่างของไฟล์ส่วนหัวพื้นฐานสำหรับ Detail View Controller ที่มีข้อกำหนดขั้นต่ำสำหรับการแยกวิเคราะห์ไฟล์ของเรา:
@ คอนเท็กซ์ RootViewController: UITableViewController {DetailViewController * detailViewController;NSXMLParser * rssParser;บทความ NSMutableArray *;รายการ NSMutableDictionary *;NSString * currentElement;NSMutableString * ElementValue;BOOL errorParsing;}คุณสมบัติ @ nonatomic, retain) IBOutlet DetailViewController * detailViewController;- (void) parseXMLFileAtURL: (NSString *) URL;ฟังก์ชัน parseXMLFileAtURL จะเริ่มกระบวนการสำหรับเรา เมื่อเสร็จสิ้นบทความ "NSMutableArray" จะเก็บข้อมูลของเรา อาร์เรย์จะถูกสร้างขึ้นจากพจนานุกรมที่ไม่แน่นอนซึ่งมีคีย์ที่เกี่ยวข้องกับชื่อฟิลด์ในไฟล์ XML ตอนนี้เราได้ตั้งค่าตัวแปรที่จำเป็นแล้วเราจะดำเนินการตามขั้นตอนต่อไปนี้ในไฟล์. m:
- (void) parserDidStartDocument: (NSXMLParser *) parser {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 เช่นตุ๊กแก) เวอร์ชั่น / 3.2.1 Safari / 525.27.1";NSMutableURLRequest request = NSMutableURLRequest requestWithURL:NSURL URLWithString: URL;request setValue: agentString forHTTPHeaderField: @ "User-Agent";xmlFile = NSURLConnection sendSynchronousRequest: request กลับข้อผิดพลาด: nil error: nil;บทความ = NSMutableArray alloc init;errorParsing = ไม่;rssParser = NSXMLParser alloc initWithData: xmlFile;rssParser setDelegate: self;// คุณอาจต้องเปลี่ยนข้อมูลเหล่านี้ขึ้นอยู่กับชนิดของไฟล์ XML ที่คุณกำลังแยกวิเคราะห์rssParser setShouldProcessNamespaces: ไม่;rssParser setShouldReportNamespacePrefixes: ไม่;rssParser setShouldResolveExternalEntities: ไม่;rssParser parse;} ฟังก์ชันนี้จะสั่งให้เครื่องยนต์ดาวน์โหลดไฟล์ที่อยู่เว็บหนึ่ง ๆ (URL) และเริ่มต้นกระบวนการสำหรับการแยกวิเคราะห์ เรากำลังบอกเซิร์ฟเวอร์ระยะไกลว่าเราเป็น Safari ที่ใช้ Mac ในกรณีที่เซิร์ฟเวอร์พยายามเปลี่ยนเส้นทาง iPhone / iPad เป็นเวอร์ชันสำหรับอุปกรณ์เคลื่อนที่ตัวเลือกในตอนท้ายมีความเฉพาะเจาะจงกับไฟล์ XML บางไฟล์ ไฟล์ RSS ส่วนใหญ่และไฟล์ XML ทั่วไปจะไม่ต้องเปิดใช้งาน
- (void) parser: (NSXMLParser *) parse parseErrorOccurred: (NSError *) parseError {NSString * errorString = NSString stringWithFormat: @ "รหัสข้อผิดพลาด% i", parseError code;NSLog (@ "ข้อผิดพลาดในการแยกวิเคราะห์ XML:% @", errorString);errorParsing = yes;}นี่เป็นข้อผิดพลาดในการตรวจสอบเส้นทางที่ง่ายซึ่งจะกำหนดค่าไบนารีหากพบข้อผิดพลาด คุณอาจต้องการบางอย่างที่เจาะจงมากกว่านี้ขึ้นอยู่กับสิ่งที่คุณกำลังทำอยู่ หากคุณต้องการเพียงแค่เรียกใช้โค้ดบางส่วนหลังจากประมวลผลในกรณีที่มีข้อผิดพลาดตัวแปรไบนารี errorParsing สามารถเรียกได้ในขณะนั้น
(NSString *) namesName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) แอตทริบิวต์ qName: (NSDictionary *) attributeDict {currentElement = elementName copy;ElementValue = NSMutableString alloc init;if (elementName isEqualToString: @ "item") {item = NSMutableDictionary alloc init;}} เนื้อที่ของตัวแยกวิเคราะห์ XML ประกอบด้วยฟังก์ชันสามอย่างซึ่งทำงานที่จุดเริ่มต้นของแต่ละองค์ประกอบซึ่งทำงานระหว่างช่วงการแยกวิเคราะห์องค์ประกอบและหนึ่งที่ทำงานที่ส่วนท้ายขององค์ประกอบ สำหรับตัวอย่างนี้เราจะแยกวิเคราะห์ไฟล์ที่คล้ายกับไฟล์ RSS ที่แบ่งองค์ประกอบออกเป็นกลุ่มภายใต้หัวข้อ "รายการ" ภายในไฟล์ XML ในตอนเริ่มต้นการประมวลผลเราจะตรวจสอบชื่อองค์ประกอบ "item" และจัดสรรพจนานุกรมรายการของเราเมื่อตรวจพบกลุ่มใหม่ มิฉะนั้นเราจะเริ่มต้นตัวแปรสำหรับค่า
- (void) parser: (NSXMLParser *) parser ที่พบอักขระ: (NSString *) สตริง {ElementValue appendString: string;} นี่เป็นส่วนที่ง่าย เมื่อเราพบอักขระเราจะเพิ่มตัวแปรเหล่านี้ลงในตัวแปร "ElementValue" ของเรา
(NSString *) namesName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {if (elementName isEqualToString: @ "item") {บทความ addObject: รายการสำเนา;} else {item setObject: ElementValue forKey: elementName;}} เมื่อเราประมวลผลองค์ประกอบเสร็จสิ้นแล้วเราจำเป็นต้องดำเนินการอย่างใดอย่างหนึ่งดังต่อไปนี้: (1) ถ้าองค์ประกอบสิ้นสุดเป็น "รายการ" เราได้ทำกลุ่มของเราเสร็จแล้วเราจะเพิ่มพจนานุกรมของเราลงใน "บทความต่างๆ " หรือ (2) ถ้าองค์ประกอบไม่ใช่ "รายการ" เราจะตั้งค่าในพจนานุกรมของเราโดยใช้คีย์ที่ตรงกับชื่อขององค์ประกอบ (ซึ่งหมายความว่าเราไม่จำเป็นต้องมีตัวแปรแต่ละตัวสำหรับแต่ละฟิลด์ภายในไฟล์ XML เราสามารถประมวลผลได้แบบไดนามิกมากกว่านี้)
- (void) parserDidEndDocument: (NSXMLParser *) parser {if (errorParsing == NO){NSLog (@ "การประมวลผล XML ทำ!");} else {NSLog (@ "ข้อผิดพลาดเกิดขึ้นระหว่างการประมวลผล XML");}} นี่คือฟังก์ชันสุดท้ายที่จำเป็นสำหรับขั้นตอนการแยกวิเคราะห์ของเรา มันก็จบลงที่เอกสาร คุณจะใส่รหัสใด ๆ ที่คุณต้องการจะเสร็จสิ้นกระบวนการที่นี่หรืออะไรพิเศษที่คุณอาจต้องการทำในกรณีที่เกิดข้อผิดพลาด สิ่งหนึ่งที่แอปหลาย ๆ แอ็พอาจต้องการทำคือการบันทึกข้อมูลและ / หรือไฟล์ XML ลงในไฟล์บนอุปกรณ์ ด้วยวิธีนี้หากผู้ใช้ไม่ได้เชื่อมต่อกับอินเทอร์เน็ตในครั้งต่อไปที่โหลดแอปพวกเขายังคงได้รับข้อมูลนี้ แน่นอนเราไม่สามารถลืมส่วนที่สำคัญที่สุด: บอกแอปพลิเคชันของคุณเพื่อแยกวิเคราะห์ไฟล์ (และระบุที่อยู่เว็บเพื่อค้นหา) ในการเริ่มต้นกระบวนการคุณเพียงแค่ต้องเพิ่มบรรทัดของโค้ดนี้ลงในตำแหน่งที่เหมาะสมที่คุณต้องการจะประมวลผล XML:
self parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml";