XMLParser Advice

人走茶凉 提交于 2020-01-01 19:53:38

问题


I'm not sure what I am doing wrong. I have a URL leading to an XML tree that looks like:

<result>
  ...
  <title>
  ...
  </title>
  <body>
  ...
  </body>
  ...
</result>

I just need to parse the file and get the title and body. Here is my object.h:

#import <Foundation/Foundation.h>

@interface Object : NSObject 
{
    NSString    *title;
    NSString    *description;
}

@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) NSString *description;

@end

And here is Object.m:

#import "Object.h"

@implementation Object

@synthesize title, description;

-(void) dealloc
{
    [title release];
    [description release];
    [super dealloc];
}

@end

Here is my XMLParser.h:

#import <Foundation/Foundation.h>
#import "Object.h"

@interface XMLParser : NSObject <NSXMLParserDelegate> 
{

    NSMutableString *currentNodeContent;

    NSMutableArray  *arrayOfObjects;
    NSXMLParser     *parser;
    Object          *currentObject;
}

@property (readonly, retain) NSMutableArray *arrayOfObjects;

-(id) loadXMLbyURL:(NSString *)urlString;

@end

And finally, XMLParser.m:

#import "XMLParser.h"
#import "Object.h"

@implementation XMLParser

@synthesize arrayOfObjects;

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

-(void) dealloc
{
    [parser release];
    [super dealloc];
}

-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if([elementName isEqualToString:@"result"])
    {
         currentObject = [Object alloc];
    }
}

-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if([elementName isEqualToString:@"title"])
    {
         currentObject.title = currentNodeContent;
    }

    if([elementName isEqualToString:@"body"])
    {
         currentObject.description = currentNodeContent;
    }

    if([elementName isEqualToString:@"result"])
    {
        [arrayOfObjects addObject:currentObject];
        [currentObject release];
        currentObject = nil;
        [currentNodeContent release];
        currentNodeContent = nil;
    }
}

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

@end

In my main code I make a call to XML parser like this:

xmlParser = [[XMLParser alloc] loadXMLbyURL:@"www.websiteWithXML.com"];

However nothing is being placed into my arrayOfObjects (I know this because when I tell a tableview to have as many rows as my array, there are no rows).

please help!!! Thank you in advance!


回答1:


Not sure if this will help...

Try changing:

arrayOfObjects  = [[NSMutableArray alloc] init];

To:

arrayOfObjects  = [[NSMutableArray alloc] initWithCapacity:0];

Other than that it appears that your code is fine. Also just because your table isn't loading anything doesn't mean that you do not have objects in your array. Use breakpoints to take a look at your data after you finish parsing and before you try to load your tableview.




回答2:


Try resetting currentNodeContent inside each of your element starts. For example:

-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if([elementName isEqualToString:@"result"])
    {
         currentObject = [Object alloc];
    }
    else if ([elementName isEqualToString:@"title"] || [elementName isEqualToString:@"body"])
    {
        [currentNodeContent setString:@""];
    }
}

Then, when you receive characters do an append:

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

By doing this, you handle the situation where a foundCharacters gets multiple times to capture all of the characters within a given element.



来源:https://stackoverflow.com/questions/8392089/xmlparser-advice

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!