2013-06-06 36 views
0

我知道有幾種方法使用NSXMLParser,RaptureXML,TouchXML等來解析xml文件的數據,但是當我使用NSXMLParser方法時,它似乎是一個漫長的過程,因爲我們必須聲明字符串,數組等。我有一個xml文件,其中包含大約7個類別的說明,也有3個關卡,我的xml文件的格式如下format,它被複制到我的項目的支持文件文件夾中。我懇請請看一下它的理解。從xml文件中獲取數據的有效和簡單的方法

我有大約21個標籤,我需要從每個類別獲取數據,這意味着我需要聲明21個數組,單獨的字符串等,如果有的話我沒有錯!

我試圖從一個類別,動物一級獲取數據。但我觀察陣列中沒有數據,我不知道如何從這裏移動:

-(void)parseAndFetchWords 
{ 
    self.animalsWordsArray = [NSMutableArray array]; 
    NSString *xmlFilePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"strings" ofType:@"xml"]; 
    NSURL *xmlLocationURL = [NSURL URLWithString:xmlFilePath]; 
    self.parser = [[NSXMLParser alloc] initWithContentsOfURL:xmlLocationURL]; 
    [parser setDelegate:self]; 
    [parser setShouldProcessNamespaces:NO]; 
    [parser setShouldReportNamespacePrefixes:NO]; 
    [parser setShouldResolveExternalEntities:NO]; 
    [parser parse]; 
} 
#pragma mark - Parser Delegate 
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    currentElement = nil; 
    currentElement = [elementName copy]; 
    if ([elementName isEqualToString:@"animalLevelOne"]) 
    { 
     self.animalName = [NSMutableString string]; 
     self.animalHint = [NSMutableString string]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
    string = [string stringByTrimmingCharactersInSet:[NSCharacterSet controlCharacterSet]]; 

    if ([currentElement isEqualToString:@"animalLevelOne"]) 
    { 
     [animalName appendString:string]; 
    } 
    else if ([currentElement isEqualToString:@"animalLevelOne"]) 
    { 
     [animalHint appendString:string]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if ([elementName isEqualToString:@"animalLevelOne"]) 
    { 
     NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 
     [dictionary setObject:animalName forKey:@"animalName"]; 
     [dictionary setObject:animalHint forKey:@"animalHint"]; 
     //And finally 
     [self.animalsWordsArray addObject:dictionary]; 
    } 
} 

能有人請提出一個更好,更簡單的方法來從XML數據,也可以是不解析,就像轉換xml到plist文件或字典等,通過它還可以實現代碼優化。

回答

1

我發現瞭如何解析XML文件沒有任何麻煩涼爽的解決方案。

以一個模型類,並將其命名爲XMLParser的用頭和主文件,申報所需的所有變量和模型類的方法,比如在我的情況下,它是:

@property(strong,nonatomic) NSMutableString *currentElementValue; 
@property(strong,nonatomic) wordJumblesAppDelegate *appDelegate; 
@property(strong,nonatomic) NSMutableArray *objects; 

//Method for parsing.... 
-(XMLParser *)initXMLParser; 

請不要理解currentElementValue是整個xml文件的每個標記中的值,並且聲明appDelegate對象以將所有已分析的數據存儲在委託類中聲明的字典中.Objects不過是用於存儲每個標記的所有值的數組。

現在,讓我們與實現部分

-(XMLParser *)initXMLParser 
{ 
    self = [super init]; 
    self.appDelegate = (gameAppDelegate *)[[UIApplication sharedApplication]delegate]; 
    return self; 
} 

實現解析器委託方法繼續前進:

//Start parsing the xml file using did start element 
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDictionary 
{ 
    if([elementName isEqualToString:@"resources"]) 
    { 
     appDelegate.categoryWords = [NSMutableDictionary dictionary]; 
    } 
    else if([elementName isEqualToString:@"string-array"]) 
    { 
     self.objects = [NSMutableArray array]; 
     if (objects) 
     { 
      [appDelegate.categoryWords setObject:objects forKey:[attributeDictionary objectForKey:@"name"]]; 
     } 
    } 
} 

//Search for characters in each tag and assign the value to our currentElementValue 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    if(!currentElementValue) 
    { 
     self.currentElementValue = [[NSMutableString alloc] initWithString:string]; 
    } 
    else 
    { 
     [currentElementValue appendString:string]; 
    } 
} 

//Finally add the currentElementValue to our objects array 
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if([elementName isEqualToString:@"resources"]) 
     return; 
    if([elementName isEqualToString:@"string-array"]) 
    { 
    } 
    else 
    { 
     [objects addObject:currentElementValue]; 
    } 
    self.currentElementValue = nil; 
} 

請大家注意到,我們的存儲陣列中的類詞詞典在應用程序委託聲明的對象文件,以便我們可以使用字典訪問項目中所需的所有xml文件值。

過程中沒有完成啓動方法應用程序啓動最後做必要的分析,即:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
// Override point for customization after application launch. 
    NSString *xmlFilePath = [[NSBundle mainBundle]pathForResource:@"categoryWords" ofType:@"xml"]; 
    NSURL *url = [NSURL fileURLWithPath:xmlFilePath]; 

    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 

    //Initialize the delegate. 
    XMLParser *parser = [[XMLParser alloc] initXMLParser]; 

    //Set delegate 
    [xmlParser setDelegate:(id)parser]; 

    //Start parsing the XML file. 
    BOOL success = [xmlParser parse]; 

    if(success) 
); 
    else 
     NSLog(@"Error Error Error!!!"); 
return YES; 
} 

示例代碼檢索數據從categoryWords字典

NSArray *allCategories = [applicationDelegate.categoryWords allKeys]; 
for (NSString *category in allCategories) 
{ 
    if ([category isEqualToString:@"animalLevelOne"]) 
    { 
     NSArray *animalsEasyData = [NSArray arrayWithObject:[applicationDelegate.categoryWords objectForKey:category]]; 
     for (NSArray *animalsEasy in animalsEasyData) 
     { 
     for (NSString *animal in animalsEasy) 
     { 
      NSArray *trimmedAnimalsEasyData = [animal componentsSeparatedByString:@"@"]; 
      [self.animalsEasyWords addObject:[trimmedAnimalsEasyData objectAtIndex:0]]; 
      [self.animalsEasyHints addObject:[trimmedAnimalsEasyData objectAtIndex:1]]; 
     } 
     } 
    } 
} 

希望這可以幫助別人,謝謝,快樂的編碼:)

-1

請試試這個代碼doctionary存儲.plist

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDir = [paths objectAtIndex:0]; 
NSString *docFilePath = [documentsDirstringByAppendingPathComponent:@"UserSettings.plist"]; 

NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:0]; 

// add the data to dict here 
[dict setObject:allMsgs forKey:@"allMsgsKey"]; 

// save the data as plist`enter code here` 
[dict writeToFile:docFilePath atomically:YES]; 
[dict release]; 
+0

對不起,我想你沒有正確地解決我的問題,我的擔憂並不關注stor ing plist中的字典,它從XML文件中獲取數據:) –

相關問題