3

我有两个 NSDictionary 对象,它们是我从服务器返回的一些 xml 数据中主元素的子元素。

xml 看起来像这样:

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

我将包含键值的第一个和第二个保存到他们自己的 NSDictionary 对象中。

问题是我可以有几个汽车元素,所以我需要保存一个包含第一个和第二个 NSDictionaries 的汽车元素数组,但我不太确定如何执行此操作。

任何帮助将不胜感激。

这是完整的 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

一切正常但是如果有几个第一个和第二个节点,当我向所有节点添加断点时,所有内容都以正确的顺序访问,然后转到 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 中的每一行都会有一个对应的第一个和第二个可变字典项。

这样,您的所有数据都在一个巨大的阵列中,并且更易于访问。我个人觉得 Array 比 XML 更容易解析。

于 2013-03-27T18:49:02.870 回答
1

不是 100% 确定我理解您的要求,但如果您只想保存遇到的第一个和第二个元素,请尝试:

- (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];
    }
}

这将为您提供一系列汽车(字典),其中包含“第一”和“第二”的一组属性。

但是,如果您想保留所有第一个和第二个元素,那么您可以创建一个汽车字典数组,其中“first”和“second”是指向属性字典数组的指针。

- (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 所以它们是它的两个对象。当我在玩弄代码工作时,我漏掉了一段代码,我然后忘记了……后来又重新发现了。

我知道没用...但已修复,感谢您的帮助。

于 2013-04-02T01:39:07.580 回答