0

NSXMLParser、RaptureXML、TouchXML などを使用して xml ファイルのデータを解析する方法がいくつかあることは知っていますが、NSXMLParser メソッドを使用すると、文字列や配列などを宣言する必要があるため、長いプロセスのように見えました。私は約7つのカテゴリを持つxmlファイルを持っており、それも3つのレベルで、私のxmlファイルは次の形式であり、プロジェクトのサポートファイルフォルダーにコピーされます。何卒ご理解の上、ご覧いただきますようお願い申し上げます。

約 21 個のタグがあり、各カテゴリからデータを取得する必要があります。つまり、約 21 個の配列、個別の文字列などを宣言する必要があります。

動物レベル 1 の 1 つのカテゴリからデータを取得しようとしました。しかし、配列にデータがありません。ここから先に進む方法がわかりません:

-(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 ファイルや辞書などに変換するなど、解析を行わなくてもかまいません。これにより、コードの最適化も実現できます。

4

2 に答える 2

-1

このコードを試して、ドキュメントを保存してください.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];
于 2013-06-06T08:18:34.550 に答える