2010-11-15 40 views
40

Có một triệu trình phân tích cú pháp XML khác nhau cho iPhone. Tôi có một tệp XML có kích thước trung bình có chứa nhiều thẻ trùng lặp (tại các điểm khác nhau trong cấu trúc phân cấp). Tôi đã nghĩ về TBXML nhưng tôi lo lắng về việc thiếu sự hỗ trợ XPath. Ví dụ, cho phép nói tập tin XML của tôi trông như thế này.Chọn đúng trình phân tích cú pháp XML của IBM

<blog> 
    <author> foo1 </author> 
    <comments> 

     <comment> 
      <text> 
       <![CDATA[ HTML code that must be extracted ]]> 
      </text> 
      <author>foo2</author> 
     </comment> 

     <comment> 
      <text> 
       <![CDATA[ Here is another post ]]> 
      </text> 
      <author>foo1</author> 
     </comment> 

    </comments> 
</blog> 

Về cơ bản các yêu cầu của tôi là tôi cần có khả năng trích xuất CData đó. Và biết liệu tác giả blog có phải là tác giả nhận xét hay không.

Trả lời

52

so sánh tốt nhất tôi đã nhìn thấy về đề tài này:

http://www.raywenderlich.com/553/how-to-chose-the-best-xml-parser-for-your-iphone-project

Sự khác biệt giữa phân tích cú pháp chậm nhất và nhanh nhất trong trường hợp của ông là một yếu tố của 2. Tùy thuộc vào yêu cầu tính năng của bạn, chắc chắn có những phân tích cú pháp có thể giảm thời gian phân tích cú pháp của bạn xuống một nửa.

+1

Một số nội dung trong bài viết đã lỗi thời, nhưng tổng thể vẫn rất hữu ích (chỉ cần đăng để mọi người có thể thấy câu trả lời này vẫn còn hiệu lực vào cuối tháng 7) – Cameron

+1

Lưu ý. KissXML đã chuyển sang Github và vẫn đang được cập nhật. https://github.com/robbiehanson/KissXML – Eonil

+1

Trong trường hợp bất kỳ ai muốn chạy lại các thử nghiệm với các trình phân tích cú pháp được cập nhật: https://github.com/jansanz/iOSXMLPerformance (Tôi cũng đã bao gồm 2 thứ khác không có trong các bài kiểm tra). –

31

Khám phá RaptureXML. Nó không phải là hành vi XPath chính thức, nhưng nó khá gần. Truy vấn của bạn sẽ là:

[rxml iterate:@"comments.comment" with: ^(RXMLElement *e) { 
    if ([[e child:@"author"].text isEqualToString:@"foo1"]) { 
     NSLog(@"Blog Text is %@.", e.text); 
    } else { 
     NSLog(@"Comment Text is %@.", e.text); 
    } 
}]; 

CẬP NHẬT: RaptureXML hiện hỗ trợ XPath!

+4

RaptureXML là xấu xa !! – user7865437

+1

Ôi trời, thật tuyệt vời! Cảm ơn bạn đã chia sẻ điều này! –

+0

Tôi có một dự án mới để làm việc trong năm nay. Điều này có vẻ tuyệt vời. – endy

0

Như bạn có yêu cầu về XML vừa

TinyXML có thể là một lựa chọn tốt cho các tài liệu vừa nếu bạn đã có kinh nghiệm với các API và cảm thấy thoải mái với C vì nó cổng khá dễ dàng hơn cho iPhone.

For More information you can go through this link

0

Tôi muốn giới thiệu một phân tích cú pháp XML nhẹ gọi là "CDXMLKit." Bạn có thể tìm thấy nó trên http://www.cdframeworks.com/product/cdxmlkit và nó thực sự dễ sử dụng.

Dưới đây là một số mẫu mã từ phân tích cú pháp:

CDXMLDocument * document = [[CDXMLDocument alloc] initWithXMLURL:@"--url--"]; 
CDXMLNode * blog = [[document childrenWithName:@"blog"] firstObject]; 
NSString * blogAuthor = [[[blog childrenWithName:@"author"] firstObject] innerContent]; 
CDXMLNode * comments = [[blog childrenWithName:@"comments"] firstObject]; 
for(CDXMLNode * commentNode in comments.children) { 
    NSString * commentAuthor = [[[commentNode childrenWithName:@"author"] firstObject] innerContent]; 
    NSString * commentText = [[[commentNode childrenWithName:@"text"] firstObject] innerContent]; 
    NSLog(@"%@: %@", commentAuthor, commentText); 
} 
1

tôi thực hiện đơn giản và nhẹ phân tích cú pháp XML mới này dành cho iOS trong Swift - AEXML

Bạn có thể sử dụng nó để đọc dữ liệu XML như thế này:

let someValue = xmlDocument["element"]["child"]["anotherChild"].value 

hoặc bạn có thể sử dụng nó để xây dựng chuỗi XML như thế này:

let document = AEXMLDocument() 
let element = document.addChild("element") 
element.addChild("child") 
document.xmlString // returns XML string of the entire document structure 

Tôi hy vọng nó sẽ hữu ích cho ai đó.

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