2012-02-08 84 views
2

我对iPhone很满意,并且已经完成了此操作,但现在无法弄清楚。 我使用XMLParser的,并得到响应如下图所示:nsxml解析器问题

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

相反,我所想到的是

username = akhildas 

我已经这样做是:

- (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]; 
} 

任何一个有同样的问题并很好地解决了它?

+2

问题来自服务器端,因为NSXml解析器类将获取从服务器端发送的数据 – Sarah 2012-02-08 05:25:06

回答

1

我总是尝试避免基于回调的(SAX)NSXMLParser转而使用DOM解析器,它为您创建DOM树模型。我发现DOM解析器更容易处理。

我最喜欢的是GDataXML解析器(由Google开发)。它非常可靠且易于使用。它仅包含2个文件(和libxml2库),但功能非常强大。 它可以帮助您查找代表方法并了解您是否正确地遵循了XML结构并以适当的方式提取了对象。

映射XML文档的Objective-C对象树可以为如下短做:

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

查看XML解析了iPhone这个非常受欢迎的教程,其中GDataXML解释:

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

希望它能让您的生活更轻松跟踪和解析XML数据。