2012-02-08 90 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數據。