2013-10-25 4 views
1

Iam new для разработки ios, мне нужно разобрать XML-данные в массив, я попробовал учебник, и я не получаю данные при редактировании с помощью «hrms.atrity.info/api/people "" XML-url, делегаты Parser не работают во время выполнения вышеуказанной ссылки. Это мое кодирование, оно работает с "image.apple.com/main/rss/hotnews/hotnews.rss". Как исправить этот зонд ,делегаты XML-анализа XML не работают

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    feeds = [[NSMutableArray alloc] init]; 
    NSURL *url = [NSURL URLWithString:@"http://hrms.atrity.info/api/people"];//NOt Working 
    NSURL *url = [NSURL 
        URLWithString:@"http://image.apple.com/main/rss/hotnews/hotnews.rss"];//This Works 
    xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
    [xmlParser setDelegate:self]; 
    [xmlParser setShouldResolveExternalEntities:NO]; 
    [xmlParser parse]; 
} 
- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
#pragma mark - Table View 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection: 
(NSInteger)section 
{ 
    return feeds.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: 
(NSIndexPath *)indexPath 

{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" 
                  forIndexPath:indexPath]; 
    cell.textLabel.text = [[feeds objectAtIndex:indexPath.row] objectForKey: @"FirstName"]; 
    return cell; 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes: 
(NSDictionary *)attributeDict 
{ 
    element = elementName; 
    if ([element isEqualToString:@"Users"]) 
    { 
     item = [[NSMutableDictionary alloc] init]; 
     title = [[NSMutableString alloc] init]; 
     link = [[NSMutableString alloc] init]; 
    } 
} 
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
    namespaceURI: 
(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if ([elementName isEqualToString:@"Users"]) 
    { 
     [item setObject:title forKey:@"FirstName"]; 
     [item setObject:link forKey:@"LastName"]; 
     [feeds addObject:[item copy]]; 
     NSLog(@"%@",feeds); 
    } 
} 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    if ([element isEqualToString:@"FirstName"]) 
    { 
     [title appendString:string]; 
    } 
    else if ([element isEqualToString:@"LastName"]) 
    { 
     [link appendString:string]; 
    } 
} 
- (void)parserDidEndDocument:(NSXMLParser *)parser 
{ 
    [self.tableView reloadData]; 
} 

Thanks in Advance.

+0

Что такое проблема? Пожалуйста, добавьте более подробную информацию, вы получаете анализируемые данные? –

+0

Я получил данные в консоли, но делегаты-парсеры не работают. Я также добавил делегат парсера. – Vijay

+0

@Vijay: Пожалуйста, поставьте точку останова во всех делегатах. Затем проверьте проблему в делегате или нет? – TamilKing

ответ

2

Используя следующий код:

xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://hrms.atrity.info/api/people"]]; 

это приводит к parser:parseErrorOccurred: вызывается для http://hrms.atrity.info/api/people URL. NSError, переданный этому делегату, содержит код ошибки 4, который переводит на NSXMLParserEmptyDocumentError. Это связано с тем, что URL-адрес возвращает JSON вместо XML. Вы можете проверить это с помощью следующего кода:

NSError *error; 
NSString *data = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://hrms.atrity.info/api/people"] encoding:NSUTF8StringEncoding error:&error]; 
NSLog(@"%@", data); 

Вы можете ясно видеть в консоли в Xcode, что данные являются JSON. Чтобы получить данные в формате XML, вам необходимо указать заголовок Accept со значением application/xml. Вы не можете сделать это с NSURL в одиночку и нужно будет использовать NSMutableURLRequest, так что вы можете установить значение пользовательского заголовка следующим образом:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://hrms.atrity.info/api/people"]]; 
[request setValue:@"application/xml" forHTTPHeaderField:@"Accept"]; 

NSURLResponse *response; 
NSError *error; 
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

xmlParser = [[NSXMLParser alloc] initWithData:data]; 
+0

Совершенно верно. Я бы предложил использовать 'sendAsynchronousRequest' (потому что вы никогда не должны отправлять' sendSynchronousRequest' из основной очереди). Несмотря на это, я извинился за то, что вы ответили на свой первоначальный ответ (я просмотрел ответ в браузере и увидел XML и слишком быстро отклонил ваш ответ). Но +1 сейчас! – Rob

+1

@Rob Не беспокойтесь. Я использовал запрос sendSynchronous, потому что для целей ответа это самый быстрый способ добраться до 'NSData'. – neilco

Смежные вопросы