简体   繁体   中英

nsxml parser issue

I am quite fine with iPhone and have done this before but can't figure it out right now. I am using the XMLParser and getting a response as shown below:

username =         {
        text = akhildas;
        type = string;
    };

Instead what I expect is

username = akhildas

What I have already done is:

- (NSDictionary *)objectWithData:(NSData *)data
{
// Clear out any old data
[dictionaryStack release];
[textInProgress release];

dictionaryStack = [[NSMutableArray alloc] init];
textInProgress = [[NSMutableString alloc] init];

// Initialize the stack with a fresh dictionary
[dictionaryStack addObject:[NSMutableDictionary dictionary]];

// Parse the XML
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
BOOL success = [parser parse];

// Return the stack's root dictionary on success
if (success)
{
    NSDictionary *resultDict = [dictionaryStack objectAtIndex:0];
    return resultDict;
}

return nil;
}

#pragma mark -
#pragma mark NSXMLParserDelegate methods

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


// Get the dictionary for the current level in the stack
NSMutableDictionary *parentDict = [dictionaryStack lastObject];

// Create the child dictionary for the new element, and initilaize it with the attributes
NSMutableDictionary *childDict = [NSMutableDictionary dictionary];
[childDict addEntriesFromDictionary:attributeDict];

// If there's already an item for this key, it means we need to create an array
id existingValue = [parentDict objectForKey:elementName];
if (existingValue)
{
    NSMutableArray *array = nil;
    if ([existingValue isKindOfClass:[NSMutableArray class]])
    {
        // The array exists, so use it
        array = (NSMutableArray *) existingValue;
    }
    else
    {
        // Create an array if it doesn't exist
        array = [NSMutableArray array];
        [array addObject:existingValue];

        // Replace the child dictionary with an array of children dictionaries
        [parentDict setObject:array forKey:elementName];
    }

    // Add the new child dictionary to the array
    [array addObject:childDict];

}
else
{
    // No existing value, so update the dictionary
    [parentDict setObject:childDict forKey:elementName];
}

// Update the stack
[dictionaryStack addObject:childDict];
}

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


// Update the parent dict with text info
NSMutableDictionary *dictInProgress = [dictionaryStack lastObject];

// Set the text property
if ([textInProgress length] > 0)
{
    [dictInProgress setObject:textInProgress forKey:kXMLReaderTextNodeKey];

    // Reset the text
    [textInProgress release];
    textInProgress = [[NSMutableString alloc] init];
}

// Pop the current dict
[dictionaryStack removeLastObject];
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
// Build the text value
[textInProgress appendString:string];
}

Any one had same problem and solved it well?

I always try to avoid callback based (SAX) NSXMLParser in favor of DOM parsers which creates DOM tree model for you. I find DOM parsers so much easier to cope with.

My favorite is GDataXML parser (developed by Google). It is very reliable and easy to use. It consists of 2 files only (and libxml2 library) but is very powerful. It saves you from looking up your delegates methods and wondering if you followed your XML structure correctly and extracted your object in proper way.

Mapping XML document to the Objective-C objects tree can be done as short as below:

NSData  *xmlData = [[NSMutableData  alloc] initWithContentsOfFile:filePath];
 NSError  *error;
 GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData 
        options:0 error:&error];
 if (doc != nil)NSLog(@"%@", doc.rootElement);

See this very popular tutorial on XML parsing for iPhone where GDataXML is explained:

http://www.raywenderlich.com/725/how-to-read-and-write-xml-documents-with-gdataxml

Hope it will make your life easier with tracking and parsing XML data.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM