Alberto Juarez
Alberto Juarez

Reputation: 444

Parsing with NSXMLParser

I have a xml file with this:

<name>Alberto</name>
<subname>Martín</subname>
<age>24</age>

I want parser it with NSXMLParser and save data it in:

NSString *name;
NSString *subname;
NSString *age;

To do it im using:

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

if( [elementName isEqualToString:@"name"])
{
    if (!soapResults)
    {
        soapResults = [[NSMutableString alloc] init];

}

    elementoEncontrado = YES;
}}

-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string{
if (elementoEncontrado)
{
    [soapResults appendString: string];
}
}

-(void)parser:(NSXMLParser *)parser 
                         didEndElement:(NSString *)elementName 
                         namespaceURI:(NSString *)namespaceURI 
                         qualifiedName:(NSString *)qName{

if ([elementName isEqualToString:@"name"])
{
    name=soapResults;
}   
if ([elementName isEqualToString:@"subname"])
{
    subname=soapResults;
}   
   if ([elementName isEqualToString:@"age"])
{
    age=soapResults;
}


 NSLog(@"%@", name, subname, age);

The problem is that subname and age never appears...

Upvotes: 0

Views: 198

Answers (1)

Ignacio Inglese
Ignacio Inglese

Reputation: 2605

You should check for all elements here, since you're only creating the NSMutableString for name elements.

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

    if( [elementName isEqualToString:@"name"])
    {
        if (!soapResults)
        {
            soapResults = [[NSMutableString alloc] init];
        }

        elementoEncontrado = YES;
    }
}

and release / nil your soapResults here, as well as set your elementoEncontrado to NO here

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

    if ([elementName isEqualToString:@"name"])
    {
        // copy or retain this, unless ARC.
        name=soapResults;
    }   

    if ([elementName isEqualToString:@"subname"])
    {
        subname=soapResults;
    }

    if ([elementName isEqualToString:@"age"])
    {
        age=soapResults;
    }
    NSLog(@"%@", name, subname, age);
    [soapResults release];
    soapResults = nil;

    elementoEncontrado = NO;
}

Upvotes: 1

Related Questions