Làm thế nào để phân tích cú pháp tệp XML trong Xcode

Một nhiệm vụ đơn giản là xương sống cho nhiều ứng dụng là khả năng phân tích các tệp XML. Và, may mắn thay, Xcode làm cho nó tương đối dễ dàng để phân tích một tệp XML trong Objective-C.

Tệp XML có thể chứa bất kỳ thứ gì từ dữ liệu cơ bản về ứng dụng của bạn đến nguồn cấp dữ liệu RSS cho trang web. Họ cũng có thể là một cách tuyệt vời để cập nhật thông tin trong ứng dụng của bạn từ xa, do đó bỏ qua sự cần thiết phải gửi một nhị phân mới cho Apple chỉ đơn giản là để thêm một mục mới vào danh sách.

Vì vậy, chúng tôi xử lý các tệp XML trong Xcode như thế nào? Quy trình này chứa các bước để khởi tạo các biến được sử dụng, bắt đầu quá trình phân tích cú pháp XML, cho quá trình đó tạo một tệp, bắt đầu một phần tử riêng lẻ, các ký tự (giá trị) trong phần tử, phần cuối của một phần tử riêng lẻ và kết thúc của quá trình phân tích cú pháp.

Trong ví dụ này, chúng tôi sẽ phân tích cú pháp một tệp từ Internet bằng cách chuyển cho nó một địa chỉ web cụ thể ( URL ).

Chúng tôi sẽ bắt đầu với việc xây dựng tệp tiêu đề. Đây là một ví dụ về tệp tiêu đề rất cơ bản cho Bộ điều khiển Chế độ xem chi tiết với các yêu cầu tối thiểu để phân tích cú pháp tệp của chúng tôi:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
Các bài viết của NSMutableArray *;
NSMutableDictionary * item;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

@property (nonatomic, giữ lại) IBOutlet DetailViewController * detailViewController;

- (void) parseXMLFileAtURL: (URL NSString *);

Hàm parseXMLFileAtURL sẽ bắt đầu quá trình cho chúng ta. Khi nó kết thúc, NSMutableArray "articles" sẽ giữ dữ liệu của chúng tôi. Mảng này sẽ được tạo thành từ điển có thể thay đổi với các khóa liên quan đến tên trường trong tệp XML.

Bây giờ chúng ta đã thiết lập các biến cần thiết, chúng ta sẽ chuyển sang phần đáp ứng của tiến trình trong tệp .m:

- (void) parserDidStartDocument: (NSXMLParser *) trình phân tích cú pháp {
NSLog (@ "Tìm thấy tệp và phân tích cú pháp");

}

Hàm này chạy khi bắt đầu quá trình. Không cần phải đặt bất cứ điều gì trong chức năng này, nhưng nếu bạn muốn thực hiện một nhiệm vụ khi tập tin bắt đầu được phân tích cú pháp, đây là nơi bạn sẽ đặt mã của bạn.

- (void) parseXMLFileAtURL: (URL NSString *)
{

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; chúng tôi) AppleWebKit / 525.27.1 (KHTML, như Gecko) Phiên bản / 3.2.1 Safari / 525.27.1";
Yêu cầu NSMutableURLRequest * = [NSMutableURLRequest requestWithURL:
[URL của NSURLVí dụ: URL]];
[yêu cầu setValue: agentString forHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: yêu cầu returnResponse: nil error: nil];


articles = [[NSMutableArray alloc] init];
errorParsing = NO;

rssParser = [[Cấp phát NSXMLParser] initWithData: xmlFile];
[rssParser setDelegate: self];

// Bạn có thể cần phải bật một số tùy chọn này tùy thuộc vào loại tệp XML bạn đang phân tích cú pháp
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];

[rssParser phân tích cú pháp];

}

Hàm này chỉ thị công cụ tải xuống một tệp tại một địa chỉ web cụ thể (URL) và bắt đầu quá trình phân tích cú pháp nó.

Chúng tôi đang nói với máy chủ từ xa rằng chúng tôi là một Safari đang chạy trên Mac chỉ trong trường hợp máy chủ cố gắng chuyển hướng iPhone / iPad sang phiên bản di động.

Các tùy chọn ở cuối là dành riêng cho các tệp XML nhất định. Hầu hết các tệp RSS và tệp XML chung chung sẽ không cần chúng được bật.

- (void) parser: (NSXMLParser *) parser parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Mã lỗi% i", [mã parseError]];
NSLog (@ "Lỗi phân tích cú pháp XML:% @", errorString);


errorParsing = YES;
}

Đây là một định tuyến kiểm tra lỗi đơn giản sẽ đặt giá trị nhị phân nếu nó gặp lỗi. Bạn có thể cần một cái gì đó cụ thể hơn ở đây tùy thuộc vào những gì bạn đang làm. Nếu bạn chỉ cần chạy một số mã sau khi xử lý trong trường hợp lỗi, biến nhị phân errorParsing có thể được gọi vào lúc đó.

- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) Các thuộc tính qName: (NSDictionary *) attributeDict {
currentElement = [elementName sao chép];
ElementValue = [[NSMutableString alloc] init];
if ([elementName isEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] init];

}

}

Thịt của trình phân tích cú pháp XML chứa ba hàm, một hàm chạy ở đầu phần tử riêng lẻ, một hàm chạy ở giữa phần tử phân tích cú pháp và một phần tử chạy ở phần cuối của phần tử.

Trong ví dụ này, chúng tôi sẽ phân tích cú pháp một tệp tương tự như các tệp RSS chia nhỏ các phần tử thành các nhóm dưới tiêu đề "các mục" trong tệp XML. Khi bắt đầu quá trình xử lý, chúng tôi đang kiểm tra tên phần tử "mục" và phân bổ từ điển mục của chúng tôi khi phát hiện nhóm mới. Nếu không, chúng tôi khởi tạo biến của chúng tôi cho giá trị.

- (void) parser: (NSXMLParser *) parser foundCharacters: (NSString *) chuỗi {
[ElementValue appendString: string];
}

Đây là phần dễ dàng. Khi chúng ta tìm thấy các ký tự, chúng ta chỉ cần thêm chúng vào biến "ElementValue" của chúng ta.

- (void) parser: (NSXMLParser *) parser đã làmEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
if ([elementName isEqualToString: @ "item"]) {
[article addObject: [mục sao chép]];
} else {
[item setObject: ElementValue forKey: elementName];
}

}

Khi chúng tôi xử lý xong một phần tử, chúng ta cần thực hiện một trong hai điều sau: (1) nếu phần tử kết thúc là "mục", chúng tôi đã hoàn thành nhóm của mình, vì vậy chúng tôi sẽ thêm từ điển của mình vào "bài viết" ".

Hoặc (2) nếu phần tử không phải là "mục", chúng tôi sẽ đặt giá trị trong từ điển của chúng tôi bằng một khóa khớp với tên của phần tử. (Điều này có nghĩa là chúng tôi không cần một biến riêng lẻ cho từng trường trong tệp XML. Chúng tôi có thể xử lý chúng một cách linh hoạt hơn một chút).

- (void) parserDidEndDocument: (NSXMLParser *) trình phân tích cú pháp {

if (errorParsing == NO)
{
NSLog (@ "xử lý XML xong!");
} else {
NSLog (@ "Lỗi xảy ra trong quá trình xử lý XML");
}

}

Đây là hàm cuối cùng cần thiết cho quy trình phân tích cú pháp của chúng tôi. Nó chỉ đơn giản là kết thúc tài liệu. Bạn sẽ đặt bất kỳ mã nào bạn muốn hoàn thành quá trình ở đây hoặc bất kỳ điều gì đặc biệt bạn có thể muốn làm trong trường hợp có lỗi.

Một điều mà nhiều ứng dụng có thể muốn làm ở đây là lưu dữ liệu và / hoặc tệp XML vào một tệp trên thiết bị. Bằng cách đó, nếu người dùng không được kết nối với Internet vào lần tiếp theo khi họ tải ứng dụng, họ vẫn có thể nhận được thông tin này.

Tất nhiên, chúng ta không thể quên phần quan trọng nhất: yêu cầu ứng dụng của bạn phân tích cú pháp tệp (và cung cấp cho nó một địa chỉ web để tìm nó tại!).

Để bắt đầu quá trình, bạn chỉ cần thêm dòng mã này vào vị trí thích hợp nơi bạn muốn thực hiện xử lý XML:

[self parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml"];