วิธีแยกไฟล์ XML ใน Xcode

งานง่ายๆที่เป็นหัวใจสำคัญของแอพพลิเคชันจำนวนมากคือความสามารถในการแยกวิเคราะห์ไฟล์ 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"];