2012-02-08 11 views
2

私はiPhoneでかなりうまくいますが、以前はこれを行っていましたが、今は理解できません。私はすでにやっていることはnsxmlパーサーの問題

username = akhildas 

ある

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

代わりに私が何を期待されています:私はXMLParserのを使用して、応答を取得しています 以下のようには

- (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

答えて

1

私はいつもあなたのためにDOMツリーモデルを作成するDOMパーサに賛成してコールバックベースの(SAX)NSXMLParserを避けるようにしています。私は、DOMパーサーがこれに対処するのがずっと簡単だと分かっています。

私のお気に入りは、Googleが開発したGDataXMLパーサーです。それは非常に信頼性が高く使いやすいです。これは2つのファイル(およびlibxml2ライブラリ)のみで構成されていますが、非常に強力です。 デリゲートのメソッドを調べたり、XML構造に正しく従っているかどうか、そしてオブジェクトを適切な方法で抽出したかどうかは疑問です。 Objective-Cのへ

マッピングXML文書はツリーは以下のように短い行うことができますオブジェクト:

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

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

はGDataXMLが説明されているiPhoneのためのXML解析で、この非常に人気のチュートリアルを参照してください。

XMLデータを追跡して解析することで、あなたの人生が楽になることを願っています。

関連する問題