2013-06-07 4 views
-3

Мне нужно динамически читать все дочерние узлы из «книги» узла с идентификатором 1 (если вы добавляете дочерний узел в xml-файл, но не должны что-либо менять в коде) и поместите значения дочерних узлов в Tableview.как читать все дочерние элементы xml с помощью Xcode?

Как я могу это сделать?

<Book id="1"> 
    <name>Vishal</name> 
    <address>Mumbai</address> 
    <country>India</country> 
    <editorial>Trillas</editorial> 
    <edicion>Segunda</edicion> 
</Book> 

<Book id="2"> 
    <name>Vinod</name> 
    <address>Delhi</address> 
    <autor>Julianne MacLean</autor> 
</Book> 

<Book id="3"> 
    <name>Sachin</name> 
    <address>pune</address> 
    <country>India</country> 
    <editorial>Porrua</editorial> 
</Book> 

<Book id="4"> 
    <name>Nilesh</name> 
    <address>Nasik</address> 
    <country>India</country> 
</Book> 

<Book id="5"> 
    <name>Video</name> 
    <address>Nasik</address> 
    <country>India</country> 
</Book> 

+1

См [NSXMLParser] (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSXMLParser_Class/Reference/Reference.html) и [Руководство по программированию на основе событий] (https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/XMLParsing/XMLParsing.html#//apple_ref/doc/uid/10000186i). – Rob

+0

Xcode не может читать XML ... –

ответ

0

вы можете Yoe XMLReader (анализатор)

XMLReader.h

#import <Foundation/Foundation.h> 


@interface XMLReader : NSObject<NSXMLParserDelegate> 
{ 
    NSMutableArray *dictionaryStack; 
    NSMutableString *textInProgress; 
    NSError __strong **_errorPointer; 

} 

+ (id)parseXML:(NSString *)file_name; 
+ (NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError **)errorPointer; 
+ (NSDictionary *)dictionaryForXMLString:(NSString *)string error:(NSError **)errorPointer; 

@end 

XMLReader.m

#import "XMLReader.h" 

NSString *const kXMLReaderTextNodeKey = @"element_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 
{ 
    string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
    // Build the text value 
    [textInProgress appendString:string]; 
} 


+ (id)parseXML:(NSString *)file_name{ 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *documentFolderPath = [paths objectAtIndex: 0]; 
    NSString *filePath = [documentFolderPath stringByAppendingPathComponent:appDelegate.path]; 
    if ([file_name isEqualToString:@"yourXMLfilename.xml"]) 
     filePath = [filePath stringByDeletingLastPathComponent]; 


    filePath = [filePath stringByAppendingPathComponent:file_name]; 

    NSString* theContents = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; 


    NSDictionary* dict = [self dictionaryForXMLString:theContents error:nil]; 
    //This dictionary contains your tags of one record. 
    // you can get yor tag value by 
    NSString *val = @""; 
    if ([[dict allKeys] containsObject:@"name"]) { 
     val = [dict objectForKey:@"name"]; 
    } 
} 
@end 
Смежные вопросы