2012-07-15 57 views
5

Tôi đang cố gắng phân tích cú pháp tệp XML (sử dụng NSXMLParser) từ thư viện website.comthing.com. Đây là tập tin đầu tiên tôi đã từng phân tích cú pháp, nhưng đối với hầu hết các phần nó có vẻ khá thẳng về phía trước. Vấn đề của tôi xảy ra khi cố gắng phân tích một khối CDATA; phương pháp phân tích cú pháp: foundCDATA: không được gọi và tôi không thể hiểu tại sao. Tôi biết trình phân tích cú pháp của tôi được thiết lập đúng bởi vì trình phân tích cú pháp: foundCharacters: phương thức hoạt động tốt. Dữ liệu XML tôi đang cố gắng phân tích trông giống như thế này http://www.librarything.com/services/rest/1.1/?method=librarything.ck.getwork&isbn=030788743X&apikey=d231aa37c9b4f5d304a60a3d0ad1dad4 và khối CDATA xảy ra bên trong phần tử có tên thuộc tính là "mô tả".Phân tích cú pháp khối CDATA XML

Bất kỳ trợ giúp nào về lý do tại sao phương pháp không được gọi sẽ được đánh giá cao!

EDIT: Tôi chạy trình phân tích cú pháp: foundCharacters: phương thức trên khối CDATA mô tả và nó trả về "<". Tôi giả định điều này có nghĩa là trình phân tích cú pháp không nhìn thấy thẻ CDATA chính xác. Có bất cứ điều gì có thể được thực hiện vào cuối của tôi để sửa lỗi này?

Trả lời

2

Dường như nội dung CDATA trong các thẻ <fact> đang được trả về gia tăng theo nhiều lần gọi lại trong parser:foundCharacters. Trong bạn lớp nơi bạn đang phù hợp với NSXMLParserDelegate thử xây dựng các CDATA bằng cách thêm nó vào một thể hiện NSMutableString, như vậy:

(Lưu ý: đây _currentElement là một tài sản NSString và _factString là một tài sản NSMutableString)

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {  
    self.currentElement = elementName; 
    if ([_currentElement isEqualToString:@"fact"]) { 
     // Make a new mutable string to store the fact string 
     self.factString = [NSMutableString string]; 
    } 

} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    if ([elementName isEqualToString:@"fact"]) { 
     // If fact string starts with CDATA tags then just get the CDATA without the tags 
     NSString *prefix = @"<![CDATA["; 
     if ([_factString hasPrefix:prefix]) { 
      NSString *cdataString = [_factString substringWithRange:NSMakeRange((prefix.length+1), _factString.length - 3 -(prefix.length+1))]; 
      // Do stuff with CDATA here... 
      NSLog(@"%@", cdataString); 
      // No longer need the fact string so make a new one ready for next XML CDATA 
      self.factString = [NSMutableString string]; 

     } 
    } 

} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if ([_currentElement isEqualToString:@"fact"]) { 
     // If we are at a fact element, append the string 
     // CDATA is returned to this method in more than one go, so build the string up over time 
     [_factString appendString:string]; 
    } 

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