【问题标题】:Xml to dictionary parsing using XML reader [closed]使用 XML 阅读器进行 XML 到字典解析 [关闭]
【发布时间】:2012-08-16 17:39:07
【问题描述】:

我想将数据转换成字典,任何建议..

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    如果您是新手并且不知道如何将 xml 解析为字典...请尝试以下方法...

    在.h文件中添加这个方法

    #import <Foundation/Foundation.h>
    
    
    @interface XMLReader : NSObject
    {
        NSMutableArray *dictionaryStack;
        NSMutableString *textInProgress;
        NSError **errorPointer;
    }
    
    + (NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError **)errorPointer;
    + (NSDictionary *)dictionaryForXMLString:(NSString *)string error:(NSError **)errorPointer;
    
    @end
    

    并在您的 .m 文件中使用这些方法解析您的 URL。

    NSString *const kXMLReaderTextNodeKey = @"text";
    
    @interface XMLReader (Internal)
    
    - (id)initWithError:(NSError **)error;
    - (NSDictionary *)objectWithData:(NSData *)data;
    
    @end
    
    
    @implementation XMLReader
    
    #pragma mark -
    #pragma mark Public methods
    
    + (NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError **)error
    {
        XMLReader *reader = [[XMLReader alloc] initWithError:error];
        NSDictionary *rootDictionary = [reader objectWithData:data];
        [reader release];
        return rootDictionary;
    }
    
    + (NSDictionary *)dictionaryForXMLString:(NSString *)string error:(NSError **)error
    {
        NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
        return [XMLReader dictionaryForXMLData:data error:error];
    }
    
    #pragma mark -
    #pragma mark Parsing
    
    - (id)initWithError:(NSError **)error
    {
        if (self = [super init])
        {
            errorPointer = error;
        }
        return self;
    }
    
    - (void)dealloc
    {
        [dictionaryStack release];
        [textInProgress release];
        [super dealloc];
    }
    
    - (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];
    }
    
    - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
    {
        // Set the error pointer to the parser's error object
        *errorPointer = parseError;
    }
    
    @end
    

    我认为这对您解析 xml 数据会有帮助。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-18
    • 2021-08-15
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    相关资源
    最近更新 更多