0

私はこの問題に少し立ち往生しています。状況は次のとおりです。xmlファイルを位置で解析しています。よく解析します。さまざまな要素をNSDictionary(位置ごとに1つのNSDictionary)に入れ、それらのNSDictionaryをNSMutableArrayに入れたいと考えています。

- (void) traverseElement:(TBXMLElement *)element {

NSMutableDictionary *position = [[NSMutableDictionary alloc]init];
NSArray *keys = [NSArray arrayWithObjects:@"cab",@"idagencedepart", @"idagencefinale",@"iddestinataire",@"idexpediteur",@"idtransporteurreexpedition",@"departement",@"message1", nil];
[position dictionaryWithValuesForKeys:keys];

do {

    TBXMLAttribute * attribute = element->firstAttribute;


    // if attribute is valid

    while (attribute) {


        if ([[TBXML elementName:element] isEqualToString:@"referencecolis"]) {
            [position setObject:[TBXML textForElement:element] forKey:@"cab"];
            NSLog(@"cab : %@",[TBXML textForElement:element]);
            };

        if ([[TBXML elementName:element] isEqualToString:@"idagencedepart"]) {
            [position setObject:[TBXML textForElement:element] forKey:@"idagencedepart"];
            NSLog(@"idagencedepart : %@",[TBXML textForElement:element]);

        };

        [modulectrlcle addObject:position];

  attribute = attribute->next;



    }

    if (element->firstChild)

        [self traverseElement:element->firstChild];



} while ((element = element->nextSibling));

}

}

これが私のコードです。うまく解析できますが、私の NSMutableArray (modulectrle) は奇妙な NSDictionaries でいっぱいです...

4

1 に答える 1

-1

while ループ内で NSDictionary を割り当てます。

do {
     TBXMLAttribute * attribute = element->firstAttribute;
     while (attribute) {
        NSMutableDictionary *position = [[NSMutableDictionary alloc]init];

        BOOL foundElement = NO;
        if ([[TBXML elementName:element] isEqualToString:@"referencecolis"]) {
            [position setObject:[TBXML textForElement:element] forKey:@"cab"];
            NSLog(@"cab : %@",[TBXML textForElement:element]);
            foundElement = YES;
        };

        if ([[TBXML elementName:element] isEqualToString:@"idagencedepart"]) {
            [position setObject:[TBXML textForElement:element] forKey:@"idagencedepart"];
            NSLog(@"idagencedepart : %@",[TBXML textForElement:element]);
            foundElement = YES;
        };

        if(foundElement) //avoid adding empty NSDictonaries
        {
             [modulectrlcle addObject:position];
        }

        attribute = attribute->next;
    }

    if (element->firstChild)
        [self traverseElement:element->firstChild];

} while ((element = element->nextSibling));

それ以外の場合は、同じ NSDictonary を配列にもう一度追加し、すべての要素を同じディクショナリにプッシュします。その結果、同じディクショナリで配列を数回取得します。

于 2013-09-16T14:56:35.483 に答える