Phân tích XML Parser

XML (viết tắt từ  eXtensible Markup Language, “Ngôn ngữ Đánh dấu Mở rộng”) là  ngôn ngữ đánh dấu với mục đích chung do W3C đề nghị, để tạo ra các ngôn ngữ đánh dấu khác. Đây là một tập con đơn giản của SGML, có khả năng mô tả nhiều loại dữ liệu khác nhau. Mục đích chính của XML là đơn giản hóa việc chia sẻ dữ liệu giữa các hệ thống khác nhau, đặc biệt là các hệ thống được kết nối với Internet. Các ngôn ngữ dựa trên XML được định nghĩa theo cách thông thường, cho phép các chương trình sửa đổi và kiểm tra hợp lệ bằng các ngôn ngữ này mà không cần có hiểu biết trước về hình thức của chúng.

Bài này mình sẽ giúp các bạn phân tích cú pháp XML, cách đọc từng thẻ trong XML.

Mục tiêu:

1, Truy cập vào trang chủ app đọc rss về :Rss là tập tin XML.Thế  RSS là gì ?

http://www.apple.com/rss/

RSS là một định dạng tập tin thuộc họ XML (ngôn ngữ đánh dấu mở rộng, một chuẩn dùng để mô tả dữ liệu) dùng trong việc chia sẻ tin tức Web (Web syndication) được dùng bởi nhiều website tin tức và nhật ký trực tuyến. Chữ viết tắt (theo tiếng Anh) của RSS dùng để chỉ các chuẩn sau:

  • Rich Site Summary (RSS 0.91)
  • RDF Site Summary (RSS 0.9 and 1.0)
  • Really Simple Syndication (RSS 2.0.0)

Với công nghệ RSS, người dùng không cần phải vào từng trang web cũng có thể biết được các trang web có tin tức gì mới. Các tin tức mới nhất, cập nhật nhất được tự động đưa tới người đọc nếu họ đăng ký để nhận RSS.

2, Đọc từng thẻ trong XML.

3. Hiển thị tiêu đề, thời gian cập nhật,Và ảnh !.

Ở đây đơn giản chúng ta làm việc với RSS top 10 songs!.

http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/topsongs/limit=10/xml

Mở trên FireFox chúng ta sẽ nhìn thấy thế này!

Screen Shot 2016-05-05 at 15.00.17

 

Source code XML ra sẽ trông thế này!

Screen Shot 2016-05-05 at 15.01.31Ok !!! Chúng ta bắt đầu nào!!!

khởi tạo proJect mới!

 

Screen Shot 2016-05-05 at 15.04.51

 

Ở đây mình đơn giản chỉ muốn giới thiệu cách hiển thị Một bài hát! với tiêu đề, thời gian xuất bản, Và ảnh của nó.!

Như vậy mình sẽ thiết kế giao diện Đơn giản như sau:

label Tiêu đề Top 10 songs Itune! trang trí cho đẹp!

Label Tên bài hát hiển thị tiêu đề bài hát. Label ngày tháng hiển thị thời gian . ImageView để hiển thị ảnh!.

Screen Shot 2016-05-05 at 15.09.05

 

Tạo class để quản lý View chúng ta vừa tạo ra.

Screen Shot 2016-05-05 at 15.14.39kết nối class với view!

Screen Shot 2016-05-05 at 15.15.31

 

Tạo property để tương tác label và imageView!

Và các biến kiếm tra xem ta đang đọc tag nào,

Và các lớp có thể thay đổi được lưu lại đường link ảnh ,các chuỗi title ,chuỗi date.

Screen Shot 2016-05-05 at 15.18.01

 

Để Phân tích XML ta đăng ký delegate! NSXMLParserDelegate

Nó sẽ trông như thế này!

@interface TopSongsViewController : UIViewController<NSXMLParserDelegate>{
    BOOL kiemTra_Title;
    BOOL kiemTra_Date;
    BOOL kiemTra_Image;
    NSMutableArray *title;
    NSMutableArray *date;
    NSMutableArray *image; 
}
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet UILabel *titleSongs;
@property (weak, nonatomic) IBOutlet UILabel *date;

Mã nguồn !

Trong ViewDidload ta khia báo bộ nhớ cho Các mảng :

title=[[NSMutableArray alloc]init];
    date=[[NSMutableArray alloc]init];
    image=[[NSMutableArray alloc]init];

url đăng ký link RSS trên “http://www.apple.com/rss/” top 10 songs Itune !

2 dòng  lệch tiếp theo đăng ký phân tích và đăng ký delegate.

dòng cuối cùng thực hiện phân tích thẻ XML!

NSURL *url=[NSURL URLWithString:@"http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/topsongs/limit=10/xml"];
    NSXMLParser *phanTichXML=[[NSXMLParser alloc]i
//lay gia tri cua the luu trongs tring
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
  
}

 

nitWithContentsOfURL:url]; phanTichXML.delegate=self; [phanTichXML parse];

Nếu bạn nào đã tìm hiểu web thì  sẽ rất rõ ràng!Một thẻ cơ bản :Mở thẻ Nội dung thẻ và đóng thẻ!

Như vậy Delegate cung cấp cho chúng ta đủ 3 phương pháp để truy vấn!

Chuẩn bị cho việc đọc một thẻ !dĩ nhiên để đọc một thẻ, Lưu tên thẻ đó ở elemntName !. tham số của thẻ lưu trong attributes.

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
   
}

Đọc nội dung của một thẻ, nội dung lưu trong biến String.

//lay gia tri cua the luu trong tring
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
   
}

Khi đóng một thẻ.Kết thúc truy vấn một thẻ nào đó!

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    
    
}

Ở đây tôi chỉ làm đơn giản là kiểm tra khi gặp thẻ nào cần truy vấn thì return YES!

kiểm tra xem có phải thẻ title không!

kiểm tra xem có phải thẻ “im:releaseDate” không!

kiểm tra xem có phải thẻ “im:image”, độ cao là 170pixel không!

 

 

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
    if ([elementName isEqualToString:@"title"]) {
        kiemTra_Title=YES;
        return;
    }
    if ([elementName isEqualToString:@"im:releaseDate"]) {
        kiemTra_Date=YES;
        return;
    }
    if ([elementName isEqualToString:@"im:image"]&&[attributeDict[@"height"] isEqualToString:@"170"]) {
        kiemTra_Image=YES;
        return;
    }
    
}

nếu gặp đúng thẻ nào ở trên thì tiếp tục chạy!

Với mỗi thẻ,

Ta lấy ra title đưa vào mảng lưu lại!

Lấy thời gian lưu vào mảng date!

Lấy link ảnh lưu vào mảng image!

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    if (kiemTra_Title) {
        [title addObject:string];
    }
    if (kiemTra_Date) {
        [date addObject:string];
    }
    if (kiemTra_Image) {
        [image addObject:string];
    }
}

như vậy chúng ta đã lấy được nội dung thẻ lưu vào mảng tương ứng!

Tuy nhiên chúng ta phải kết thúc Thẻ để đến với thẻ tiếp theo!

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    if (kiemTra_Title) {
        kiemTra_Title=NO;
    }
    if (kiemTra_Date) {
        kiemTra_Date=NO;
    }
    if (kiemTra_Image) {
        kiemTra_Image=NO;
    }
}

ok! Chúng ta quay lại viewDidload dể tải lên tiêu đề  thời gian image set vào giao diện:

Ở đây mình chỉ lấy một bài hát!

settex cho tiêu đề và thời gian tương ứng vơi label.

Để load ảnh trên mạng !UIImage hỗ trợ load data – mà data hỗ trợ load url ! vì vậy chúng ta sẽ khởi tạo URL .

- (void)viewDidLoad {
    [super viewDidLoad];
    title=[[NSMutableArray alloc]init];
    date=[[NSMutableArray alloc]init];
    image=[[NSMutableArray alloc]init];
    
    NSURL *url=[NSURL URLWithString:@"http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/topsongs/limit=10/xml"];
    NSXMLParser *phanTichXML=[[NSXMLParser alloc]initWithContentsOfURL:url];
    phanTichXML.delegate=self;
    [phanTichXML parse];
    [self.titleSongs setText:title[0]];
    [self.date setText:date[0]];
    NSString *strUrl=image[0];
    NSURL *linkImage=[NSURL URLWithString:strUrl];
    NSData *data=[NSData dataWithContentsOfURL:linkImage];
    UIImage *image=[UIImage imageWithData:data];
    self.imageView.image=image;
}

ok chúng ta thử biên dịch chúng ta sẽ được kết quả!

 

Screen Shot 2016-05-05 at 15.58.02

 

 

các bạn cũng có thể tuỳ biến danh sách tableView lựa chọn để xem chi tiết !!!

Bài tiếp theo mình sẽ giới thiệu các bạn dùng JSon để load dữ liệu!!!

full code!!!

http://www.mediafire.com/download/sqcg88nz1jvcamk/XML.zip
  • Nếu các bạn muốn biết thêm các kỹ thuật khác về ios, các bạn có thể tham khảo thêm các khóa học ios tại đây.

Add a Comment

Your email address will not be published. Required fields are marked *