2

NSArray に格納される dog を除いて、すべての要素は NSStrings に格納されます。すべての犬のエントリを NSArray に追加したいと考えています。現在、配列に追加されている犬の値は 1 つだけです。すべての犬の値を NSArray に追加するにはどうすればよいですか?

<root>
         <element>
                <person>Jim<person/> 
                <age>21<age/>
                <dog>Labrador<dog/>
                <dog>Beagle<dog/>
                <dog>Yorkshire Terrier<dog/>
         <element/>
         <element>
                <person>Jill<person/> 
                <age>50<age/>
                <dog>Boxer<dog/>
                <dog>Pug<dog/>
                <dog>Labrador<dog/>
                <dog>Beagle<dog/>
                <dog>Yorkshire Terrier<dog/>
         <element/>
     </root>


 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
      namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
        attributes:(NSDictionary *)attributeDict {

        if([elementName isEqualToString:@"root"]) {
            //Initialize the array.
            appDelegate.entries = [[NSMutableArray alloc] init];
        }
        else if([elementName isEqualToString:@"element"]) {

            //Initialize the entry.
            anEntry = [[Entry alloc] init];

            //Extract the attribute here.
            anEntry.entryID = [[attributeDict objectForKey:@"id"] integerValue];

            NSLog(@"Reading id value :%i", anEntry.entryID);
        }

        NSLog(@"Processing Element: %@", elementName);
    }

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

        if(!currentElementValue) 
            currentElementValue = [[NSMutableString alloc] initWithString:string];
        else
            [currentElementValue appendString:string];

        NSLog(@"Processing Value: %@", currentElementValue);

    }

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
      namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

        if([elementName isEqualToString:@"root"])
            return;


        if([elementName isEqualToString:@"element"]) {
            [appDelegate.entries addObject:anEntry];

            anEntry = nil;
        }
        else
            [anEntry setValue:currentElementValue forKey:elementName];

        currentElementValue = nil;
    }
4

1 に答える 1

0

これは、キー ドッグに複数の値があるためです。
だからあなたが言うなら:

[anEntry setValue:currentElementValue forKey:elementName];

次に、そのキー (elementName) には既に値が含まれている可能性があります。パーサーをうまく使用しており、それがどのように機能するかを理解しています。唯一のことは、要素とルートだけでなく、すべてのタグを考慮する必要があることです。 .else タグが犬の場合も考慮する必要があります。

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

    if([elementName isEqualToString:@"root"])
        return;


    if([elementName isEqualToString:@"element"]) {
        [appDelegate.entries addObject:anEntry];

        anEntry = nil;
    }
    else if([elementName isEqualToString: @"dog"])
    {
        [anEntry.dogs addObject: currentElementValue];
    }
    else
        [anEntry setValue:currentElementValue forKey:elementName];

    currentElementValue = nil;
}

この場合、エントリ クラスには、読み取り可能な NSMutableArray である、dogs という名前のプロパティが必要です。

于 2012-11-30T16:20:19.767 に答える