2009-07-06 57 views
18

Hôm nay tôi đang xem xét cách tạo một trình phân tích cú pháp XML đơn giản trong Cocoa (cho máy tính để bàn). Tôi đang nghĩ đến việc sử dụng NSXMLParser để phân tích dữ liệu, nhưng tôi không biết chắc nên bắt đầu từ đâu. Tệp XML trên web không có nhiều dữ liệu trong đó, chỉ là một danh sách đơn giản với một vài thứ mà tôi cần lưu vào một biến. Có ai có bất cứ đề nghị về cách làm điều này, như các tài liệu trực tuyến về việc này không phải là làm cho quá nhiều ý nghĩa.Phân tích cú pháp XML trong Cocoa

Cảm ơn bạn đã trợ giúp!

EDIT Lý do tại sao tôi muốn tạo trình phân tích cú pháp XML là lấy thông tin từ cơ sở dữ liệu MYSQL trên máy chủ đến ứng dụng khách. Nếu có một số cách tốt hơn để làm điều này bên cạnh trình phân tích cú pháp XML, vui lòng cho tôi biết!

+0

điều gì không có ý nghĩa trong tài liệu trực tuyến? – hhafez

+0

Tôi không chỉ chắc chắn những gì tôi nên ghi đè để làm cho nó hoạt động. – PF1

+0

Không có gì để ghi đè. Bạn tạo một đối tượng riêng và chỉ định nó là đại biểu của trình phân tích cú pháp. Trong đối tượng đó, bạn trả lời một số thư nhất định (một số yêu cầu, một số tùy chọn) cho bạn biết trình phân tích cú pháp đã tìm thấy gì. –

Trả lời

48

Đây là cách hoạt động:

Có một lớp có tên là NSXMLParser. Nó được sử dụng để phân tích các tệp XML. Tuy nhiên, NSXMLParser là ngu ngốc. Tất cả những gì nó biết cách làm là phân tích cú pháp XML, nhưng nó không biết nó phải làm gì với thông tin mà nó tìm thấy.

Nhập một đại biểu. Một đại biểu giống như một vú em. Vì XMLParser không có một đầu mối phải làm gì với thông tin mà nó tìm thấy, nó đi và hỏi đại biểu của nó về mỗi và mọi thứ: "Này! Tôi bắt đầu phân tích một tài liệu! Tôi có nên làm gì không?" "Hey! Tôi tìm thấy một số CDATA! Tôi phải làm gì với nó!" "Này! Tôi tìm thấy một thẻ khác!" "Này! Tôi tìm thấy một thẻ đóng!", V.v. Tất cả những "Hey!" các câu lệnh là các phương thức ủy nhiệm, hoặc nói cách khác, chúng là các phương thức tùy chọn mà một đối tượng đại biểu có thể chọn để thực hiện. Thông thường (nhưng không phải lúc nào), đối tượng tạo NSXMLParser cũng là đại biểu, nhưng điều đó không phải là trường hợp.

Vì vậy, bạn có thể có một cái gì đó như thế này:

NSXMLParser * parser = [[NSXMLParser alloc] initWithContentsOfURL:someURLToAnXMLFile]; 
[parser setDelegate:self]; 
[parser parse]; 
[parser release]; 

Sau đó, trong cùng một đối tượng (tự), bạn có thể có một số trong những phương pháp:

- (void)parserDidStartDocument:(NSXMLParser *)parser { 
    //the parser started this document. what are you going to do? 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { 
    //the parser found an XML tag and is giving you some information about it 
    //what are you going to do? 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    //the parser found some characters inbetween an opening and closing tag 
    //what are you going to do? 
} 

- (void)parserDidEndDocument:(NSXMLParser *)parser { 
    //the parser finished. what are you going to do? 
} 

Có một bó toàn bộ những các phương thức được liệt kê trong tài liệu. Chỉ cần truy cập tham chiếu lớp NSXMLParser và tất cả chúng đều được liệt kê trong phần "Phương thức đại biểu". Một khi bạn nhận được hang của nó, NSXMLParser là khá dễ sử dụng. Nó là SAX Parser, có nghĩa là trình phân tích cú pháp theo hướng sự kiện. Nó tìm thấy công cụ, và nó cho bạn biết về nó.

+0

Cảm ơn Dave: Thực sự hữu ích! Và, trong tương lai, bạn có đề xuất sử dụng XML hoặc MYSQL cho truyền thông cơ sở dữ liệu/khách hàng không? – PF1

+3

Tôi có thể sử dụng cả hai. Nếu tôi cần kết nối máy khách-máy chủ, và tôi kiểm soát cả hai đầu, tôi có thể giữ dữ liệu trong cơ sở dữ liệu MySQL, sau đó truy cập dữ liệu đó bằng một số tập lệnh PHP để tạo ra dữ liệu thích hợp được định dạng dưới dạng XML (Plist XML cụ thể) Tôi có thể làm những việc như NSArray * myArray = [NSArray arrayWithContentsOfURL: urlToMyPHPScript];) –

+0

@Dave Làm cách nào để định dạng XML thành PLIST, và điều đó có nghĩa là tôi có thể tạo một NSDictionary và sắp xếp như thế? Tôi cũng đã thử một số nội dung với NSXMLParser và tôi tự hỏi bạn sẽ đề xuất cách sử dụng các lệnh mà bạn đã đăng ở trên để liên kết phần tử và các ký tự tìm thấy. Ví dụ: bạn biết rằng "Một số mô tả" nằm trong phần tử "Mô tả". Cảm ơn tất cả sự giúp đỡ của bạn. – PF1

Các vấn đề liên quan