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

Iphone 如何解析具有相同名称的多个节点并在不同控制器中显示的XML?,iphone,nsxmlparser,xmlnode,Iphone,Nsxmlparser,Xmlnode,请参见下面的XML 这个XML有多个图像名称,我必须在它们各自的控制器中显示不同的标题(有四个标题)。 我有4个控制器,并且必须在不同的控制器中显示每个蛾的值,以及它们的多个图像值,我如何才能做到这一点 我可以做一个物体,我应该做四个物体吗 我对此有点困惑,请帮帮我。使用TBXML,您可以轻松解析xml,并将其转换为要使用的对象: libxml2也是一种可以轻松解析的语言 try this it worked properly -(void)parser:(NSXMLPar

请参见下面的XML

这个XML有多个图像名称,我必须在它们各自的控制器中显示不同的标题(有四个标题)。 我有4个控制器,并且必须在不同的控制器中显示每个蛾的值,以及它们的多个图像值,我如何才能做到这一点

我可以做一个物体,我应该做四个物体吗


我对此有点困惑,请帮帮我。

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

libxml2也是一种可以轻松解析的语言

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]];
    }
这个XML有多个图像名称,我必须显示不同的 标题(有四个标题)在各自的控制器中。我有四个 控制器,并且必须在不同的控制器中显示每个蛾值, 除了它们的多个图像值外,我如何才能做到这一点

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

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

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

在SO上(以及通过Google)解析XML有很多问题

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


只要你的应用程序是只读的,这就可以正常工作。如果期望各种控制器也编辑对象图,那么它需要稍微复杂一点,因为您必须处理更改传播(这是CoreData的亮点;它使更改管理、传播、验证和撤消相对简单)。

是的,您可以这样做。在派生特定数据时,可以触发特定viewController的协议调用,在派生其他三个viewController的数据时,也可以采用相同的方式触发它们的协议调用。所以协议的使用可以解决你的问题。我试过Bhatt,但有点困惑,你能给我一点想法吗?通过给出代码,它是tableview,有四行,每行将显示各自的方法,我在解析你的url后添加了所有代码将此代码添加到你的项目中:检查输出,说明数据不完整,由于foundCharacter方法在一个描述节点内执行的次数太多,根据其行为,Ron AnswerOk也存在同样的问题现在尝试一下它给出大约90%的最接近输出,只需稍作更改即可使其达到100%:)我以前从未使用过它,您能告诉我使用TBXML使用这种xml的想法吗,问题是有一个名称的multipletag,所以同样的事情,我甚至无法通过TBXMLGo找到我的答案,继续使用libxml2,一旦您遵循它并正确地使用它…它将生成具有相同名称的节点数组。唯一的办法就是尝试一下,您将只从libxml2获得解决方案。即使我也有相同的并行节点,比如,但一旦你在libxml2的帮助下解析,它将生成employee数组。在代码中使用retainCount是毫无意义的,并且引起了人们的怀疑,它的其余部分可能也会被破坏。如果你知道@bbumn在我看到这一点时没有时间的话,更好的方法是给出问题的答案。希望确保此代码没有被盲目复制/粘贴,因为它有一些严重的问题。@bbum如果您知道更好的方法,请帮助我。因为我使用相同的方法