【发布时间】:2010-11-17 22:33:31
【问题描述】:
我有一个关于 xml 解析的问题。通常,XML 文件样式是这样的:
<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
【问题讨论】:
-
你确定你使用的是 NSXMLParser 吗?它是一个 SAX 风格的解析器,这意味着每次它到达一个元素的开头/结尾时都会收到一个回调,等等——没有 API 可以通过名称向它询问一个元素。 NSXML 听起来更像你在说什么。
-
您发布的一小部分代码看起来不错。问题可能出在其他地方。发布您正在实现的所有 NSXMLParser 委托方法中的所有代码。
-
是的,我正在使用 NSXMLParser。原始的 XML 并不是这么简单,我只是对这种 XML 样式感到困惑。如果 XML 文件没有
没有问题。 -
代表很好,我很确定 "if ([elementName isEqualToString:@"element"]) { if ([[attributeDict objectForKey:@"type"] isEqualToString:@" 有问题名称"){ ..... } }
-
整个代码都很大>.
标签: iphone objective-c xml parsing