3

サーバーから返されたいくつかの xml データのメイン要素のサブ要素である 2 つの NSDictionary オブジェクトがあります。

xml は次のようになります。

<Car>
  <first element1="1" element2="2">
    <second/>
  </first>
  <first element1="1" element2="2">
    <second/>
  </first>
  <first element1="1" element2="2">
    <second/>
  </first>
</Car>

keyvalues を含む first と second を独自の NSDictionary オブジェクトに保存しています。

問題は、複数の car 要素を持つことができるため、1 番目と 2 番目の NSDictionaries を含む car 要素の配列を保存する必要があることですが、これを行う方法がよくわかりません。

どんな助けでも大歓迎です。

完全な XML スキーマは次のとおりです。

<Eng>
    <Result         >
        <Series         >
            <Link/>
            <FMF/>
                <AlsoLink/>
                <Plugins/>
            </FMF>
            <Sheet          >
                <Car>
                    <first            >
                    <second/>
                    </first>
                    <second            >
                    <first/>
                    </second>
                </Car>
            </Sheet>
        </Series>
    </Result>
</Eng>

質問への更新:

this is what my NSXMLParser methods are currently looking like
- (void)startTheParsingProcess:(NSData *)parserData
    {
        NSXMLParser *parser = [[NSXMLParser alloc] initWithData:parserData]; //parserData passed to NSXMLParser delegate which starts the parsing process
        [parser setDelegate:self];
        [parser parse]; // starts the event-driven parsing operation.
    }

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    {
        if ([elementName isEqualToString:@"first"]) {
            parsedFirstMutableDictionary = [[NSMutableDictionary alloc] initWithDictionary:attributeDict];
        }
        if ([elementName isEqualToString:@"second"]) {
            parsedSecondMutableDictionary = [[NSMutableDictionary alloc] initWithDictionary:attributeDict];
        }
        if ([elementName isEqualToString:@"Car"]) {
            self.parsedDataArrayOfDictionaries = [NSMutableArray arrayWithCapacity:8];
        }
    }

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

        if ([elementName isEqualToString:@"first"]) {
            [parsedDataArrayOfDictionaries addObject:parsedFirstMutableDictionary];
            [parsedDataArrayOfDictionaries addObject:parsedSecondMutableDictionary];
        }
    }

    //etc

すべて正常に動作しますが、最初と 2 番目のノードがいくつかある場合、それらすべてにポイントブレークを追加すると、すべてが正しい順序でアクセスされ、didEndElement メソッドに移動して最初のノードにジャンプし、配列に NSDictionaries を正しく追加してからジャンプします戻って解析を開始すると、その時点から、追加されたばかりの parsedDataArrayOfDictionaries の古い値が失われます。

これに関する助けがあれば、大歓迎です。

4

3 に答える 3

1

これにより実装の書き直しが必要になるかどうかはわかりませんが、そこにデータを格納するために 3 つの NSMutableArray を定義できませんか?

 NSMutableArray * _fullCarList;
 NSMutableArray * _parsedFirstMutableDictionary;
 NSMutableArray * _parsedFirstMutableDictionary

;

次に、XML データをそれぞれの可変辞書から対応する MutableArray に追加し、両方の辞書を fullCarList 配列に追加しますか?

_fullCarList = [[NSMutableArray alloc] initWithObjects: _parsedFirstMutableDictionary, _parsedFirstMutableDictionary, nil];

配列の配列。

次に、_fullCarlist の各行を _fullCarlist を反復処理するだけで、対応する 1 番目と 2 番目の変更可能な辞書項目が含まれます。

このようにして、すべてのデータが 1 つの巨大な配列にまとめられ、はるかに簡単にアクセスできるようになります。個人的には、Array は XML よりも解析しやすいと感じています。

于 2013-03-27T18:49:02.870 に答える
1

あなたが求めていることを100%理解できるとは限りませんが、遭遇した最初の1番目と2番目の要素のみを保存したい場合は、次を試してください:

- (void)startTheParsingProcess:(NSData *)parserData
{
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:parserData]; //parserData passed to NSXMLParser delegate which starts the parsing process
    [parser setDelegate:self];
    [parser parse]; // starts the event-driven parsing operation.
    self.carArray = [NSMutableArray array];     // array of car dictionaries
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"first"]) {
        if ([carDictionary objectForKey: @"first"] == nil)
            [carDictionary setObject: attributeDict forKey: @"first"];
    }
    if ([elementName isEqualToString:@"second"]) {
        if ([carDictionary objectForKey: @"second"] == nil)
            [carDictionary setObject: attributeDict forKey: @"second"];
    }
    if ([elementName isEqualToString:@"Car"]) {
        carDictionary = [NSMutableArray dictionary];
    }
}

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

    if ([elementName isEqualToString:@"Car"]) {
        [self.carArray addObject: carDictionary];
    }
}

これにより、「1 番目」と「2 番目」の一連の属性を持つ車 (辞書) の配列が得られます。

ただし、最初と 2 番目の要素をすべて保持したい場合は、「最初」と「2 番目」が属性辞書の配列へのポインターであるカーディクショナリーの配列を作成できます。

- (void)startTheParsingProcess:(NSData *)parserData
{
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:parserData]; //parserData passed to NSXMLParser delegate which starts the parsing process
    [parser setDelegate:self];
    [parser parse]; // starts the event-driven parsing operation.
    self.carArray = [NSMutableArray array];     // array of car dictionaries
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"first"]) {
        [firstArray addObject: attributeDict];
    }
    if ([elementName isEqualToString:@"second"]) {
        [secondArray addObject: attributeDict];
    }
    if ([elementName isEqualToString:@"Car"]) {
        firstArray = [NSMutableArray array];
        secondArray = [NSMutableArray array];
        carDictionary = [NSMutableDictionary dictionary];
        [carDictionary setObject: firstArray forKey: @"first"];
        [carDictionary setObject: secondArray forKey: @"second"];
   }
}

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

    if ([elementName isEqualToString:@"Car"]) {
        [self.carArray addObject: carDictionary];
    }
}

ああ、最後に、didEndElement で elementName が「Car」の場合に、これらを追加することをお勧めします。

于 2013-03-28T19:54:24.860 に答える
1

物事を片付けるために、私のコードはすべて問題ありません.parsedDataArrayOfDictionariesを2回初期化していたので、それらは2つのオブジェクトでした..コードを動作させるために遊んでいたときに、それから忘れていました...そして後で再発見しました。

役に立たないことはわかっていますが、修正しました。助けてくれてありがとう。

于 2013-04-02T01:39:07.580 に答える