0
votes

I have a NSXML parser that is willing to retrieve data out and put it into NSMutable array. It works when i NSLog the array out. But when i display the array into the table view it fails. Is good if can tell me more specific on which error that i have because there is no error when running.

This is my ViewDidLoad

       - (void)viewDidLoad {
            [super viewDidLoad];
           // output = [[NSMutableArray alloc]initWithObjects:@"red",@"green", nil];
            NSLog(@"Response recieved");
            output= [[NSMutableArray alloc] init];
            feeds = [[NSMutableArray alloc] init];
        //    NSString *severity = @"Informational";
            NSString *soapMessage = @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
            "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
                                     "<soap:Body>"
                                    " <IncidentGetList xmlns=\"https://www.monitoredsecurity.com/\">"
                                     "<Severity></Severity>"
                                     "<SourceOrganization></SourceOrganization>"
                                     "<DestinationOrganization></DestinationOrganization>"
                                    "<MaxIncidents></MaxIncidents>"
                                     "<SourceIP></SourceIP>"
                                     "<Category></Category>"
                                     "<ExcludeCategory></ExcludeCategory>"
                                     "<StartTimeStampGMT></StartTimeStampGMT>"
                                     "<EndTimeStampGMT></EndTimeStampGMT>"
                                     "<CustomerSeverity></CustomerSeverity>"
                                     "</IncidentGetList>"
                                     "</soap:Body>"
                                     "</soap:Envelope>";


            NSURL *url = [NSURL URLWithString:@"https://api.monitoredsecurity.com/SWS/incidents.asmx"];
            NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
            NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];

            [theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
            [theRequest addValue: @"https://www.monitoredsecurity.com/IncidentGetList" forHTTPHeaderField:@"SOAPAction"];
            [theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];
            [theRequest setHTTPMethod:@"POST"];
            [theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];







            NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
            [connection start];

            if(connection)
            {
                webResponseData = [NSMutableData data] ;

            }
            else
            {
                NSLog(@"Connection is NULL");
            }
        }

This is my NSXMLparser

    //Implement the NSXmlParserDelegate methods
    -(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
      namespaceURI:(NSString *)namespaceURI qualifiedName:
    (NSString *)qName attributes:(NSDictionary *)attributeDict
    {
      element = elementName;

        if ([element isEqualToString:@"SecurityIncidentSummary"]) {

            IncidentGetList    = [[NSMutableDictionary alloc] init];

            Severity   = [[NSMutableString alloc] init];

        }    //NSLog(@"current element: ", elementName);
    }
    - (void)parserDidStartDocument:(NSXMLParser *)parser{
        NSLog(@"File found and parsing started");

    }
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {
        if ([element isEqualToString:@"Severity"]) {
            [Severity appendString:string];
        }
    }
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
      namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    {
        if ([elementName isEqualToString:@"SecurityIncidentSummary"]) {

            [IncidentGetList setObject:Severity forKey:@"Severity"];

            [feeds addObject:[IncidentGetList copy]];
        }

    [self.datalist reloadData];
    }

    - (void)parserDidEndDocument:(NSXMLParser *)parser {

       NSLog(@"Final Feed : %@",feeds);
        //[self.datalist reloadData];
    }

This is my tableview

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

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)
    return [feeds count];

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


static NSString *cellId = @"UITableViewCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
    if(cell == nil){
        cell= [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];


    }

   cell.textLabel.text= [[feeds objectAtIndex:indexPath.row]objectForKey:@"Severity"];
    //cell.textLabel.text= output[indexPath.row];
    return cell;





}
1
Have you assigned your table view's datasource? have you connected table view's outlet? - Kreiri
log this "cell.textLabel.text" and observe what does it show? - Jamil
yes i have assign the datasource and connected to IBoutlet. - zac

1 Answers

0
votes

Check out this XMLParser example which I have done.

In your .h file:

@interface RssViewController : UIViewController<NSXMLParserDelegate,UITableViewDataSource,UITableViewDelegate>
{
    NSString *element;
    NSXMLParser *xml;
    NSMutableDictionary *item;
    NSMutableString *title;
    NSMutableString *link;
    NSMutableString *description;
    NSMutableArray *arrmute;
}
@property (weak, nonatomic) IBOutlet UITableView *tview;

In .m file:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    arrmute=[[NSMutableArray alloc]init];
    NSURL *url=[[NSURL alloc]initWithString:@"http://news.google.co.in/news?cf=all&hl=en&pz=1&ned=in&topic=tc&output=rss"];
    xml=[[NSXMLParser alloc]initWithContentsOfURL:url];
    xml.delegate=self;
    xml.shouldResolveExternalEntities=YES;
   [xml parse];
}

NSXMLParser delegates methods :-

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    element = elementName;

    if ([element isEqualToString:@"item"])
    {
       item=[[NSMutableDictionary alloc] init];
       title=[[NSMutableString alloc] init];
       link=[[NSMutableString alloc] init];
       description=[[NSMutableString alloc] init];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
   if ([element isEqualToString:@"title"])
   {
      [title appendString:string];
   }
   else if ([element isEqualToString:@"link"])
   {
      [link appendString:string];
   }
   else if ([element isEqualToString:@"description"])
   {
      [description appendString:string];
   }
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
  if ([elementName isEqualToString:@"item"]) {

     [item setObject:title forKey:@"title"];
     [item setObject:link forKey:@"link"];
     [item setObject:description forKey:@"description"];

     [arrmute addObject:[item copy]];
 }
}
- (void)parserDidEndDocument:(NSXMLParser *)parser
{    
   [self.tview reloadData];
}

TableView Methods:-

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
    cell.textLabel.text=[[arrmute objectAtIndex:indexPath.row] objectForKey:@"title"];
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
    return cell;
}

Hope this will help you...