我有两个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>
我将第一个和第二个包含keyvalues保存到它们自己的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中的旧值丢失了..
对此的任何帮助都将受到hugley的赞赏。
答案 0 :(得分:1)
我不确定这是否需要重新编写您的实现,但是您不能定义3个NSMutableArray来存储您的数据吗?
NSMutableArray * _fullCarList;
NSMutableArray * _parsedFirstMutableDictionary;
NSMutableArray * _parsedFirstMutableDictionary
然后将您的XML数据从各自的可变字典添加到相应的MutableArray,然后将这两个字典添加到fullCarList数组中?
_fullCarList = [[NSMutableArray alloc] initWithObjects: _parsedFirstMutableDictionary, _parsedFirstMutableDictionary, nil];
数组数组。
然后你可以遍历_fullCarlist _fullCarList中的每一行都会有一个对应的第一个和第二个可变字典项。
这样,您的所有数据都在一个巨大的阵列中,并且更容易访问。我个人觉得数组比XML更容易解析。
答案 1 :(得分: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”时添加这些东西。
答案 2 :(得分:1)
好的只是为了清理一切,我的代码的所有内容都很好,只是因为我将两次解析,因为他们是两个对象...当我正在玩代码时,我滑了一堆代码因为那时我忘记了...后来被重新发现了。
无用我知道......但是修复了,谢谢你的帮助。