1

午後のオーバーフロー、

私のコードでは、NSData 形式の SOAP 応答を解析しようとしています。そのデータを使用して、NSXMLParse を使用して、辞書の配列を作成しようとしています。問題は、新しい辞書を配列に追加するたびに、古い辞書オブジェクトの内容が現在追加されているものに置き換えられることです。たとえば、解析の最後には、配列に同じ内容の 7 つの辞書があります。これが私が行ったことを示すコードです。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"Received the SOAP data.");

    if (!itemArray) {
        itemArray = [[NSMutableArray alloc] init];
    }
    else {
        itemArray = nil;
        itemArray = [[NSMutableArray alloc] init];
    }

    if (!itemDictionary) {
        itemDictionary = [[NSMutableDictionary alloc] init];
    }
    else {
        itemDictionary = nil;
        itemDictionary = [[NSMutableDictionary alloc] init];
    }

    parser = [[NSXMLParser alloc] initWithData:webData];
    [parser setDelegate:self];
    [parser parse];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
    NSLog(@"Started Element %@", elementName);
    element = [NSMutableString string];
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    if(element == nil) {
        element = [[NSMutableString alloc] init];
    }

    [element appendString:string];
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    NSLog(@"Found an element named: %@ with a value of: %@", elementName, element);

    if (![elementName isEqualToString:@"item"]) {
        [itemDictionary setValue:element forKey:elementName];
    }
    else if ([elementName isEqualToString:@"item"]) {
        if (itemDictionary) {
            [itemArray addObject:itemDictionary];

            [itemDictionary removeAllObjects];
        }
    }
}

前もって感謝します。よろしく

4

3 に答える 3

0

removeAllObjects を呼び出すと、配列が追加しているディクショナリの同じインスタンスが使用されます。辞書を変更すると、配列に含まれる同じ辞書が変更されます (両方が実際には同じであるため)。そのため、removeAllObjects を呼び出す代わりに、新しい要素が始まるたびに新しい辞書を作成します。

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
    NSLog(@"Started Element %@", elementName);
    itemDictionary = [[NSMutableDictionary alloc] init];
    element = [NSMutableString string];
}
于 2013-07-04T10:09:30.597 に答える
0

それ以外の:

[itemArray addObject:itemDictionary];
[itemDictionary removeAllObjects];

試す:

[itemArray addObject:itemDictionary];
itemDictionary = [[NSMutableDictionary alloc] init];

したがって、辞書からすべての項目を削除する代わりに、次のコンテンツ セット用に新しい辞書を作成します。

于 2013-07-04T09:27:50.407 に答える