iOS/iPhone XML Parser / XML Feed from URL (NSXMLParser ,Objective-C) |
iOS/iPhone XML Parser / XML Feed from URL (NSXMLParser ,Objective-C) แม้ว่าในปีจจุบันจะมีการใช้ JSON มาแทนที่ XML ในหลาย ๆ Interface ของโปรแกรม เช่น การส่งค่าระหว่าง Web Server กับ Client วิธีการในปัจจุบันก็จะถูกแทนที่ด้วย JSON ซะส่วนมาก แต่ XML ก็ยังถูกในบาง Interface เช่นการ Feed ข้อมูลจาก Server ซึ่งยังใช้ XML Feed เช่นเดิม หรือในบาง Application ก็จะยังใช้ XML เป็นมาตรฐานในการแลกเปลี่ยนข้อมูล และสำหรับ iOS ก็จะมี Class ไว้สำหรับ XML เช่นเดียวกัน โดยจะชื่อว่า NSXMLParser ที่จะช่วยในการ แยกและแตกข้อความจาก XML ให้อยู่ในรูปแบบที่จะสามารถแปลงเป็นข้อมูลแบบ Array ที่จะนำไปใช้กับส่วนอื่น ๆ ของโปรแกรมได้
iOS/iPhone XML Parser / XML Feed from URL (NSXMLParser ,Objective-C)
ในบทความนี้จะได้เรียนรู้ทั้งฝั่ง Server ที่จะใช้ PHP กับ MySQL ในการแปลงข้อมูลให้อยู่ในรูปแบบของ XML ซึ่งจะทำหน้าที่ส่ง Request ไปกับ URL ที่ Client ได้ทำการ Request เข้ามา โดย iOS ที่เขียนด้วย Objective-C จะใช้การ Request ข้อมูลผ่าน URL ด้วย initWithContentsOfURL ซึ่งจะได้ข้อมูลที่อยู่ในรูปแบบของ NSXMLParser ที่จะสามารถ delegate method ต่าง ๆ เพื่อค้นหา element ต่าง ๆ ที่ต้องการ
Web Server ฐานข้อมูล MySQL และ PHP ในการที่จะแปลงเป็น XML
CREATE TABLE `gallery` (
`GalleryID` int(3) NOT NULL auto_increment,
`Name` varchar(50) NOT NULL,
`TitleName` varchar(150) NOT NULL,
`Thumbnail` varchar(100) NOT NULL,
PRIMARY KEY (`GalleryID`)
) ENGINE=MyISAM AUTO_INCREMENT=5 ;
--
-- Dumping data for table `gallery`
--
INSERT INTO `gallery` VALUES (1, 'Name 1', 'The my gallery title 1', 'https://www.thaicreate.com/url/girl1.jpg');
INSERT INTO `gallery` VALUES (2, 'Name 2', 'The my gallery title 2', 'https://www.thaicreate.com/url/girl2.jpg');
INSERT INTO `gallery` VALUES (3, 'Name 3', 'The my gallery title 3', 'https://www.thaicreate.com/url/girl3.jpg');
INSERT INTO `gallery` VALUES (4, 'Name 4', 'The my gallery title 4', 'https://www.thaicreate.com/url/girl4.jpg');
โครงสร้างของ MySQL Database
getGalleryXML.php ไฟล์ PHP สำหรับอ่าน MySQL Database และแปลงเป็น XML
<?php
header("Content-type:text/xml; charset=UTF-8");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
echo '<?xml version="1.0" encoding="utf-8"?>';
$objConnect = mysql_connect("localhost","root","root");
$objDB = mysql_select_db("mydatabase");
$strSQL = "SELECT * FROM gallery WHERE 1 ";
$objQuery = mysql_query($strSQL);
?>
<gallery>
<?php
while($obResult = mysql_fetch_array($objQuery))
{
?>
<image>
<GalleryID><?php echo $obResult["GalleryID"];?></GalleryID>
<Name><?php echo $obResult["Name"];?></Name>
<TitleName><?php echo $obResult["TitleName"];?></TitleName>
<Thumbnail><?php echo $obResult["Thumbnail"];?></Thumbnail>
</image>
<?php
}
?>
</gallery>
<?php
mysql_close($objConnect);
?>
เมื่อเรียกผ่าน URL จะได้ XML ดังรูป
<?xml version="1.0" encoding="utf-8"?>
<gallery>
<image>
<GalleryID>1</GalleryID>
<Name>Name 1</Name>
<TitleName>The my gallery title 1</TitleName>
<Thumbnail>https://www.thaicreate.com/url/girl1.jpg</Thumbnail>
</image>
<image>
<GalleryID>2</GalleryID>
<Name>Name 2</Name>
<TitleName>The my gallery title 2</TitleName>
<Thumbnail>https://www.thaicreate.com/url/girl2.jpg</Thumbnail>
</image>
<image>
<GalleryID>3</GalleryID>
<Name>Name 3</Name>
<TitleName>The my gallery title 3</TitleName>
<Thumbnail>https://www.thaicreate.com/url/girl3.jpg</Thumbnail>
</image>
<image>
<GalleryID>4</GalleryID>
<Name>Name 4</Name>
<TitleName>The my gallery title 4</TitleName>
<Thumbnail>https://www.thaicreate.com/url/girl4.jpg</Thumbnail>
</image>
</gallery>
iOS Objective-C การ Request ข้อมูล XML ที่อยู่บน Web Server
NSURL *xmlURL = [NSURL URLWithString:@"https://www.thaicreate.com/url/getGalleryXML.php"];
xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];
[xmlParser setDelegate: self];
[xmlParser parse];
โดยหลังจากนี้จะพบกับ delegate method อยู่ 4-5 ตัว
// เมื่อเริ่มทำการ Parser
– parserDidStartDocument:
// เจอ Tag เปิดของ Element
– parser:didStartElement:namespaceURI:qualifiedName:attributes:
// เจอ String ใน Element ปัจจุบัน
– parser:foundCharacters:
// เจอ Tag ปิดของ Element
– parser:didEndElement:namespaceURI:qualifiedName:
// เมื่อเกิด Error
– parser:parseErrorOccurred:
// เมื่อทำการ Parser เสร็จสิ้น
– parserDidEndDocument:
Example การใช้ NSXMLParser อ่าน XML และการแสดงผลข้อมูลที่ได้บน Table View (UITableView)
เริ่มต้นด้วยการสร้าง Application แบบง่าย ๆ ด้วย Single View Application ดังรูป
เลือกและไม่เลือกรายการดังรูป
ตอนนี้หน้าจอ View จะยังว่าง ๆ
ให้ลาก Table View (UITableView) มาวางไว้บนหน้าจอ View
คลิกขวาที่ Table View ให้ทำการเชื่อม dataSource กับ delegete กับ File's Owner
ใน Class ของ .h ให้ทำการเชื่อม IBOutlet ให้เรียบร้อย จากนั้นเขียน Code ทั้งหมดดังนี้
ViewController.h
//
// ViewController.h
// tableViewXMLParser
//
// Created by Weerachai on 12/8/55 BE.
// Copyright (c) 2555 Weerachai. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate,NSXMLParserDelegate>
@property (retain, nonatomic) IBOutlet UITableView *myTable;
@end
ViewController.m
//
// ViewController.m
// tableViewXMLParser
//
// Created by Weerachai on 12/8/55 BE.
// Copyright (c) 2555 Weerachai. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
{
NSMutableArray *myObject;
// A dictionary object
NSMutableDictionary *dict;
// Define keys
NSString *galleryid;
NSString *name;
NSString *titlename;
NSString *thumbnail;
// Current Element
NSString *currentElement;
// Temp Variable
NSMutableString *currentGalleryID, *currentName, *currentTitleName, *currentThumbnail;
NSXMLParser *xmlParser;
}
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// Define keys
galleryid = @"GalleryID";
name = @"Name";
titlename = @"TitleName";
thumbnail = @"Thumbnail";
// Create array to hold dictionaries
myObject = [[NSMutableArray alloc] init];
NSURL *xmlURL = [NSURL URLWithString:@"https://www.thaicreate.com/url/getGalleryXML.php"];
xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];
[xmlParser setDelegate: self];
[xmlParser parse];
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
currentElement = [elementName copy];
if([elementName isEqualToString: @"image"]){
dict = [[NSMutableDictionary alloc] init];
currentGalleryID = [[NSMutableString alloc] init];
currentName = [[NSMutableString alloc] init];
currentTitleName = [[NSMutableString alloc] init];
currentThumbnail = [[NSMutableString alloc] init];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
/*
if([currentElement isEqualToString: @"GalleryID"]){
[currentGalleryID appendString: string];
}else if([currentElement isEqualToString: @"Name"]){
[currentName appendString: string];
}else if([currentElement isEqualToString: @"TitleName"]){
[currentTitleName appendString: string];
}else if([currentElement isEqualToString: @"Thumbnail"]){
[currentThumbnail appendString: string];
}
*/
if(![[string stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]] isEqualToString: @""]){
if([currentElement isEqualToString: galleryid]){
[currentGalleryID appendString: string];
}else if([currentElement isEqualToString: name]){
[currentName appendString: string];
}else if([currentElement isEqualToString: titlename]){
[currentTitleName appendString: string];
}else if([currentElement isEqualToString: thumbnail]){
[currentThumbnail appendString: string];
}
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
/*
if([elementName isEqualToString: @""GalleryID]){
[dict setObject: currentGalleryID forKey: @"GalleryID"];
}else if([elementName isEqualToString: @"Name"]){
[dict setObject: currentName forKey: @"Name"];
}else if([elementName isEqualToString: @"TitleName"]){
[dict setObject: currentTitleName forKey : @"TitleName"];
}else if([elementName isEqualToString: @"Thumbnail"]){
[dict setObject: currentThumbnail forKey: @"Thumbnail"];
}else if([elementName isEqualToString: @"image"]){
[myObject addObject: dict];
}
*/
if([elementName isEqualToString: galleryid]){
[dict setObject: currentGalleryID forKey: galleryid];
}else if([elementName isEqualToString: name]){
[dict setObject: currentName forKey: name];
}else if([elementName isEqualToString: titlename]){
[dict setObject: currentTitleName forKey: titlename];
}else if([elementName isEqualToString: thumbnail]){
[dict setObject: currentThumbnail forKey: thumbnail];
// Add Object
}else if([elementName isEqualToString: @"image"]){
[myObject addObject: dict];
}
}
- (void)parserDidEndDocument:(NSXMLParser *)parser {
NSLog(@"Gallery list array has %d items", [myObject count]);
NSMutableDictionary *gallery;
for(int i = 0; i < [myObject count]; i ++){
gallery = [myObject objectAtIndex: i];
NSLog(@"\nGalleryID: %@\nName: %@\nTitleName: %@\nThumbnail: %@\n\n",
[gallery objectForKey: galleryid],
[gallery objectForKey: name],
[gallery objectForKey: titlename],
[gallery objectForKey: thumbnail]);
}
// Reload Data
[_myTable reloadData];
}
// delegate for TableView
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return myObject.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
// Use the default cell style.
cell = [[[UITableViewCell alloc] initWithStyle : UITableViewCellStyleSubtitle
reuseIdentifier : CellIdentifier] autorelease];
}
NSDictionary *tmpDict = [myObject objectAtIndex:indexPath.row];
NSURL *url = [NSURL URLWithString:[tmpDict objectForKey:thumbnail]];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *img = [[UIImage alloc] initWithData:data];
cell.imageView.image = img;
cell.textLabel.text = [tmpDict objectForKey:name];
cell.detailTextLabel.text= [tmpDict objectForKey:titlename];
//[tmpDict objectForKey:galleryid]
//[tmpDict objectForKey:name]
//[tmpDict objectForKey:titlename]
//[tmpDict objectForKey:thumbnail]
return cell;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)dealloc {
[_myTable release];
[super dealloc];
}
@end
Screenshot
แสดงการ XML Feed ด้วย NSXMLParser ซึ่งจะแสดงผลบน Table View
.
|
ช่วยกันสนับสนุนรักษาเว็บไซต์ความรู้แห่งนี้ไว้ด้วยการสนับสนุน Source Code 2.0 ของทีมงานไทยครีเอท
|
|
|
By : |
ThaiCreate.Com Team (บทความเป็นลิขสิทธิ์ของเว็บไทยครีเอทห้ามนำเผยแพร่ ณ เว็บไซต์อื่น ๆ) |
|
Score Rating : |
|
|
|
Create/Update Date : |
2012-12-12 14:10:53 /
2017-03-26 09:01:34 |
|
Download : |
|
|
Sponsored Links / Related |
|
|
|
|
|
|
|