<person>
<name> abc </name>
<age> 19 </age>
<gender> male </gender>
</person>
通过这种方式,我们使用
elementName isEqualToString:@"name"
elementName isEqualToString:@"age"
elementName isEqualToString:@"gender"
识别元素。
现在,我面临的xml文件样式如下:
<person>
<element type="name">abc</element>
<element type="age">19</element>
<element type="gender">male</element>
</person>
在这种情况下,我们无法使用
elementName isEqualToString:@"name"
所以我尝试使用
if ([elementName isEqualToString:@"element"]) {
if ([[attributeDict objectForKey:@"type"] isEqualToString:@"name"){
.....
}
}
标识“名称”,但它给了我一个无值,如果我试图获得“名称”的值,则没有任何内容。
那么,有没有人有任何建议来解决这个问题?感谢
PS:这是我的代码的一部分
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
attributes:(NSDictionary *)attributeDict {
if ( [elementName isEqualToString:@"area"]) {
if ([[attributeDict objectForKey:@"type"] isEqualToString:@"location"]) {
NSString *description = [attributeDict objectForKey:@"description"];
NSArray *lineEntry = [[NSArray alloc] initWithObjects:description,nil ];
NSArray *lineKeys = [[NSArray alloc] initWithObjects:@"description",nil];
NSDictionary *dictItem = [[NSDictionary alloc] initWithObjects:lineEntry forKeys:lineKeys];
[lineKeys release];
[lineEntry release];
[dataLoad addObject:dictItem];
[dictItem release];
}
}
if ([elementName isEqualToString:@"forecast-period"]) {
NSString *index = [attributeDict objectForKey:@"index"];
NSString *time = [attributeDict objectForKey:@"start-time-local"];
NSArray *indexEntry = [[NSArray alloc] initWithObjects:index,time,nil];
NSArray *indexKey = [[NSArray alloc] initWithObjects:@"index",@"start-time-local",nil];
NSDictionary *dicIndex = [[NSDictionary alloc] initWithObjects:indexEntry forKeys:indexKey];
[indexEntry release];
[indexKey release];
[weatherLoad addObject:dicIndex];
[dicIndex release];
}
}
它适用于这两个部分,但是如果我试图获得“forecast_icon_code”,“air_temperature_minimum”,“air_temperature_maximum”,“precis”,它就不起作用。
<forecast-period index="1" start-time-local="2010-11-19T00:00:00+11:00" end-time-local="2010-11-20T00:00:00+11:00" start-time-utc="2010-11-18T13:00:00Z" end-time-utc="2010-11-19T13:00:00Z">
<element type="forecast_icon_code">1</element>
<element type="air_temperature_minimum" units="Celsius">12</element>
<element type="air_temperature_maximum" units="Celsius">24</element>
<text type="precis">Sunny.</text>
</forecast-period>
有什么建议吗?顺便说一下,整个xml文件在这里:ftp://ftp2.bom.gov.au/anon/gen/fwo/IDV10753.xml
答案 0 :(得分:2)
我假设您希望将预测期间的所有“元素”添加到您将index和start-time-local放在同一个字典中?
问题中发布的原始基本if语句很好,但问题是NSXMLParser,每个xml标记(“forecast-period”,“element”,“text”等)会导致didStartElement方法触发
由于有多个“预测期”标记和多个“元素”标记,因此您的代码需要跟踪当前父标记/对象的内容。处理完“forecast-period”标记后,didStartElement将再次触发以下“element”标记。在该调用中,方法参数不会指示此“元素”是具有“索引”1的“预测期”的子元素。您的代码必须跟踪它。
此外,由于“element”标签具有实际值(例如,type = precis的“Sunny”),因此您必须实现foundCharacters和didEndElement。
在didEndElement中,根据当前目标对象的内容,您必须将数据放在适当的位置。如果它是“预测期”的结束,则什么都不做(它没有价值)。如果它是“元素”标记的结尾,则必须获取foundCharacters捕获的值并将其添加到weatherLoad中的最后一个字典中。这也意味着您需要更改为使用NSMutableDictionary而不是NSDictionary。
@itsaboutcode给你的链接有一个很好的例子(它在“处理属性”部分之上。
答案 1 :(得分:0)