2012-04-18 41 views
9

Tôi đang sử dụng NSXMLParser để phân tích một xml từ một url (mã của tôi là gần như giống hệt nhau như here)NSXMLParser không thể phân tích ký tự đặc biệt (dấu)

Một số yếu tố chứa các ký tự đặc biệt như "á "làm cho một từ thích được chia thành hai (á và ndre).

Đây là loadXMLByURL tôi

-(id) loadXMLByURL:(NSString *)urlString{ 
tickets  = [[NSMutableArray alloc] init]; 
NSURL *url  = [NSURL URLWithString:urlString]; 
NSData *data = [[NSData alloc] initWithContentsOfURL:url]; 
parser   = [[NSXMLParser alloc] initWithData:data]; 
parser.delegate = self; 
[parser parse]; 
return self;} 

Tôi khá chắc chắn rằng đó là vì mã hóa không được thiết lập (Tôi nghĩ rằng nó cần phải được NSUTF8StringEncoding) nhưng tôi không chắc chắn nơi/làm thế nào để áp dụng nó.

[UPDATE] Phần còn lại của mã của tôi ...

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{  
    if ([elementname isEqualToString:@"ticket"]) 
    { 
     currentTicket = [Ticket alloc]; 
    } 

} 

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if ([elementname isEqualToString:@"name"]) 
    { 
     currentTicket.name = currentNodeContent; 
    } 
    else if ([elementname isEqualToString:@"title"]) 
    { 
     currentTicket.title = currentNodeContent; 
    } 
    else if ([elementname isEqualToString:@"status"]) 
    { 
     currentTicket.status = currentNodeContent; 
    } 
    else if ([elementname isEqualToString:@"ticket"]) 
    { 
     [tickets addObject:currentTicket]; 
     [currentTicket release]; 
     currentTicket = nil; 
     [currentNodeContent release]; 
     currentNodeContent = nil; 
    } 

} 

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
} 

[UPDATE 2] mẫu xml ...

<RB> 
    <list> 
     <ticket> 
      <name>Andrew Ford</name> 
      <title>3rd release</title> 
      <status>1</status> 
     </ticket> 

     <ticket> 
      <name>David Jenkins</name> 
      <title>3rd release</title> 
      <status>0</status> 
     </ticket> 

     <ticket> 
      <name>Luis gomez ándre</name> 
      <title>3rd release</title> 
      <status>1</status> 
     </ticket> 
    </list> 
</RB> 
+0

Tôi là người mới sử dụng Obj-C, nhưng dường như với tôi rằng bạn có thể chuyển đổi dữ liệu thành NSString, mã hóa thành UTF8 [như được hiển thị ở đây] (http://stackoverflow.com/questions/2467844/ convert-utf-8-encoded-nsdata-to-nsstring) và chuyển nó cho NSXMLParser? – inkedmn

+0

Tôi sử dụng NSXMLParser rất nhiều và chưa gặp phải vấn đề đó. Bạn có thể đăng phần của mã xử lý văn bản XML không? –

+0

Đăng phần còn lại của mã của tôi. Tôi tự hỏi, nếu vấn đề bây giờ nằm ​​trong foundCharacters? –

Trả lời

5

tôi sẽ tải các url với một NSString và sau đó chuyển đổi như thế này.

-(id) loadXMLByURL:(NSString *)urlString{ 

    tickets  = [[NSMutableArray alloc] init]; 
    NSURL *url  = [NSURL URLWithString:urlString]; 
    NSError *error; 
    NSString * dataString = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; 
    NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; 
    parser   = [[NSXMLParser alloc] initWithData:data]; 
    parser.delegate = self; 
    [parser parse]; 
    return self; 

} 

EDIT: phần của vấn đề có thể là phương pháp parser:foundCharacters: của bạn được gán cho currentNodeContent của bạn thay vì phụ thêm. Xem Tài liệu Apple tại liên kết sau.

http://developer.apple.com/library/ios/#documentation/cocoa/reference/NSXMLParserDelegate_Protocol/Reference/Reference.html

Từ doc:

Do chuỗi có thể chỉ là một phần của tổng hàm lượng ký tự cho phần tử hiện hành, bạn nên thêm nó vào sự tích lũy hiện tại của nhân vật cho đến khi thay đổi phần tử.

+1

Cảm ơn bạn. Điều đó đã không hoàn toàn giải quyết vấn đề của tôi (mặc dù tôi nghĩ rằng nó sẽ)! Làm một NSLog (@ "% @", dataString); cho thấy chuỗi ký tự thực sự bao gồm các ký tự có dấu trọng âm vv.Tuy nhiên một từ như ándre vẫn đang phá vỡ. Điều đó làm cho tôi nghĩ rằng vấn đề là trong foundcharacters(). Xem câu hỏi được cập nhật của tôi. –

+0

Tác phẩm có bị hỏng trong nhật ký bạn đã đề cập hoặc chỉ sau khi nghĩ đến trình phân tích cú pháp không? –

+0

Trong nhật ký, các chuỗi được hiển thị chính xác. Khi thêm đối tượng vào mảng vé, tên có ký tự đặc biệt sẽ được đăng ký dưới dạng hai đối tượng riêng biệt. –

1

Sử dụng

NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; 

và để có được chuỗi từ đó, làm điều này:

NSString *theXML = [[NSString alloc] initWithBytes:[data mutableBytes] 
                length:[data length] 
               encoding:NSUTF8StringEncoding]; 

Sau đó, bạn có thể phân tích cú pháp xml trong các phương pháp NSXMLParserDelegate của bạn.

Hy vọng điều này sẽ hữu ích.

4

Đã tìm thấy sự cố! Nó thực sự là trong các nhân vật được tìm thấy. Bạn nên thay đổi mã của mình thành mã này:

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    NSLog(@"found characters: %@", string); 
    if (!currentNodeContent) { 
     currentNodeContent = [[NSMutableString alloc] init]; 
    } 
    [currentNodeContent appendString:string]; 
} 

Tôi đã gặp vấn đề tương tự trước đó và mã ở trên đã sửa nó.

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