使用NSXMLParser进行解析器XML

时间:2010-11-17 22:33:31

标签: iphone objective-c xml parsing

嘿伙计们,我有一个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

2 个答案:

答案 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)