如何解析具有相同名称的多个节点的XML并显示在不同的控制器中?

时间:2011-10-03 04:44:54

标签: iphone nsxmlparser xmlnode

请参阅下面的XML

http://sosmoths.com/.xml/moths.xml

这个XML有多个图像名称,我必须在各自的Controller中显示不同的标题(有四个标题)。 我有4个控制器,并且必须在不同的控制器中显示每个蛾值,以及它们的多个图像值,我该怎么办?

我可以制作单个对象,我应该制作四个对象吗?

我有点困惑,请帮助我。

3 个答案:

答案 0 :(得分:1)

  

这个XML有多个图像名称,我必须要显示不同的   各自的财务主任职称(有四个职称)。我有4个   控制器,并且必须在不同的Controller中显示每个moth值,   连同他们的多个图像值,我该怎么办?

这听起来不像是XML解析问题,更像是应用程序架构问题。

该XML基本上描述了一些数据,并且所述数据通常由应用程序中的对象表示。您可以使用基于CoreData的解决方案,将XML解析为本地CoreData存储(在内存或磁盘上,不重要),然后按常规显示托管对象。

或者,假设它代表一组典型的数据,您可以将其解析为您自己的手动对象(或者甚至是字典和数组),然后从那里进行显示。

有很多关于在SO(以及谷歌)上解析XML的问题。

问题的第二部分尚未解决。基本上,您需要将应用程序正确地分层到模型 - 视图 - 控制器模式中。您的模型层将解析XML并创建表示数据的对象图。每个控制器都会引用该单个模型。

只要您的应用是只读的,这就可以正常工作。如果期望各种控制器也编辑对象图,那么它将需要更加复杂,因为你必须处理变更传播(这是CoreData闪耀的地方;它进行变更管理,传播,验证,并撤消相对简单的。)

答案 1 :(得分:0)

使用TBXML,您可以轻松解析xml,并将其转换为要使用的对象:

http://www.tbxml.co.uk/TBXML/TBXML_Free.html

和libxml2也可以轻松解析。

答案 2 :(得分:0)

try this it worked properly       
  -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict{
            NSLog(@"%@",elementName);
            if([elementName isEqualToString:@"moths"]){
                mytblarray=[[NSMutableArray alloc] init];
            } else if([elementName isEqualToString:@"moth"]){
                tmpdic=[[NSMutableDictionary alloc] init];
            }
            else if([elementName isEqualToString:@"images"]){
                imgArray=[[NSMutableArray alloc] init];
            }

        }

        -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

            if(tmpstr!=nil && [tmpstr retainCount]>0){ [tmpstr release]; tmpstr=nil; }
            tmpstr=[[NSString alloc] initWithString:string];

        }

        -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

            if([elementName isEqualToString:@"moth"]){
                [mytblarray addObject:tmpdic];
                [tmpdic release];
            }if([elementName isEqualToString:@"images"]){
                [tmpdic setValue:imgArray forKey:elementName];
            }
            else if([elementName isEqualToString:@"image"]){
                [imgArray addObject:tmpstr];        
            }
            else if([elementName isEqualToString:@"id"] || [elementName isEqualToString:@"title"]||[elementName isEqualToString:@"description"]){
                [tmpdic setValue:tmpstr forKey:elementName];
            }

        }

        -(void)parserDidEndDocument:(NSXMLParser *)parser{
            NSLog(@"%@",[imgArray description]);
            NSLog(@"%@",[mytblarray description]);
        }
        - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //get value like it
        NSString *cellValue = [[mytblarray objectAtIndex:indexPath.row] valueForKey:@"id"];
    }
        - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //get value like it

            NSMutableDictionary *dict=[[NSMutableDictionary alloc]initWithDictionary:
    [mytblarray objectAtIndex:indexPath.row]];
    }
相关问题