此iOS XML解析案例的最佳方法

时间:2012-10-29 09:38:35

标签: ios xml nsxmlparser

我想改变这个XML:

<tennis>
<date>01-01-2013
<tournament>
<location>
<city>London</city>
<venue>Wimbledon</venue>
</location>
<match>
<player>Andy Murray</player>
<player>Roger Federer</player>
</match>
<match>
<player>Rafa Nadal</player>
<player>Andy Roddick</player>
</match>
</tournament>

<date>02-01-2013
<tournament>
<location>...

进入显示日期的tableview,选中后将导航到分组的tableview,Venue为section header,以及表行中的匹配列表。

我的问题是什么是最好的方法。目前我正在使用NSXMLParser ..

  • 创建一个字典,每个日期都是场地数组的关键。
  • 创建Match对象,并在字典中为每个Venue存储Match数组。

然后我的第一个tableview只显示Date字典中的键,当选择一行时,它会将相关的Venues数组'传递给下一个tableview类。

然后从第二个字典中选择匹配对象,使用传入的Venues数组作为查找的关键字。

如果这令人困惑,请向我道歉。当我把它写出来时,这对我来说。

  • 这是构建数组和字典的NSXMLParser方法,设置标志以保持状态等,这是像我这样的XML的推荐方法吗?

  • 我应该使用DOM解析器吗?

提前感谢。

2 个答案:

答案 0 :(得分:0)

你可以尝试这个xml解析器:

SMXMLDocument

它使xml成为很好的数组或字典供你使用

答案 1 :(得分:0)

我使用XSXMLparser从网站解析一些XML,然后通过以下方式在表格中显示密钥:

[myDictionary allKeys]objectAtIndex:indexPath.row;

然后在选择时,我创建一个新的表实例并通过属性设置重要变量:

tableScreen *tableScreenNew = [[tableScreen alloc]init];
            tableScreenNew.currentLevel = 1;
            tableScreenNew.numberOfRows = counter;
            tableScreenNew.parsedData = parsedData;
            [self.navigationController pushViewController:tableScreenNew animated:YES];

这将使用我需要的数据推送新表,并在cellForRow:我只有一个if:

if(currentLevel == 0)
{

}
else if(currentLevel == 1)
{

}
else
{
 NSLog(@"I Messed up");
}

在cellForRow中为你需要的内容分配一个临时字典:

NSDictionary *tempDictionary = [NSDictionary dictionaryWithDictionary:[originalParsedData valueForKey:dateKeyNameFromLastTable]];

编辑:解析代码

NSData *myData = [xmlToParse dataUsingEncoding:NSUTF16StringEncoding];

    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:myData];
    [parser setDelegate:self];

 if([parser parse])
    {
         NSLog(@"Success");
         NSLog(@"****************************** Finished Dictionary ******************************");
         for(int i = 0;i < [parsedData count];i++)
         {
             NSLog(@"%d:%@",i,[parsedData objectAtIndex:i]);
         }
         NSLog(@"*********************************************************************************");
     }
    else
    {
         NSLog(@"Epic Fail");
         NSLog(@"%@",[parser parserError]);
    }




   - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict
{
    NSLog(@"Processing Element: %@", elementName);
    NSLog(@"Processing Attributes: %@", attributeDict);

    //Here you would start adding the key/Dicts to a NSMutableDictionary which you would use to populate tables

[myNSMutableDictionary addObject:attributeDict forKey:elementName];
}