如何在 iphone 中解析多个 .xml 文件?

Posted

技术标签:

【中文标题】如何在 iphone 中解析多个 .xml 文件?【英文标题】:How to parse Multiple .xml files in iphone? 【发布时间】:2013-02-06 09:07:06 【问题描述】:

这是我第一次使用 xmls,所以如果我的问题质量低,请不要对我苛刻。我正在开发应用程序,我使用服务器中的 xml 文件检索所有数据。

在这里发布问题之前,我阅读了一些关于 xml 文件解析的Tutorials。但是当我开始在我的应用程序中实现它时,当我尝试解析第二个 Xml 文件等等时,我完全感到困惑。

现在我想用一些屏幕截图来解释我的应用程序流程,以便每个人都能轻松实现我想要的。

    First view Second view Third view

现在,当我在第一个视图中单击任何行时,它会转到第二个视图并在第二个视图中显示所有相关数据,当我单击第二个视图中的任何项目时,它会转到第三个视图并显示有关该特定项目的详细信息。

在解释了应用程序流程之后,现在我展示我的代码我到目前为止尝试过的内容。按照教程,我只是简单地将类(XMLParser、Book)拖到我的应用程序中进行测试。

代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 
NSURL *url = [[NSURL alloc] initWithString:@"Firstviewxmlurl"];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
XMLParser *parser = [[XMLParser alloc] initXMLParser];
[xmlParser setDelegate:parser];
BOOL success = [xmlParser parse];
if(success)
    NSLog(@"No Errors");
else
    NSLog(@"Error Error Error!!!");
 

现在我的 XMLParser.m 代码是

- (XMLParser *) initXMLParser 

[super init];

appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

return self;
  

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
attributes:(NSDictionary *)attributeDict 

if([elementName isEqualToString:@"Collections"]) 
    //Initialize the array.
    appDelegate.books = [[NSMutableArray alloc] init];

else if([elementName isEqualToString:@"Collection"]) 

    //Initialize the book.
    aBook = [[Book alloc] init];

    //Extract the attribute here.
    aBook.bookID = [[attributeDict objectForKey:@"id"] integerValue];

    NSLog(@"Reading id value :%i", aBook.bookID);


NSLog(@"Processing Element: %@", elementName);
    

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

if(!currentElementValue) 
    currentElementValue = [[NSMutableString alloc] initWithString:string];
else
    [currentElementValue appendString:string];

NSLog(@"Processing Value: %@", currentElementValue);


 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
   namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
if([elementName isEqualToString:@"Collections"])
    return;
if([elementName isEqualToString:@"Collection"]) 
    [appDelegate.books addObject:aBook];

    [aBook release];
    aBook = nil;

else 
    [aBook setValue:currentElementValue forKey:elementName];

[currentElementValue release];
currentElementValue = nil;
  

最后我的第一个视图类代码是

    #pragma mark Table Methods

  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  
return 1;
  


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
 
//return [tblViewData count];
return [appDelegate.books count];
 

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    
static NSString *CellIdentifier = @"SimpleTableIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil)

    cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
    cell.selectionStyle=UITableViewCellSelectionStyleGray;
    cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;

//cell.textLabel.text=[[tblViewData objectAtIndex:indexPath.row]
                    // stringByReplacingOccurrencesOfString:@"*" withString:@""];
   Book *aBook = [appDelegate.books objectAtIndex:indexPath.row];

cell.textLabel.text = aBook.title;

if([deviceType isEqualToString:@"ipad"])

    [cell.textLabel setFont:[UIFont fontWithName:@"Helvetica-Bold" size:20]];

//cell.textLabel.font=[UIFont fontWithName:@"Walkway_SemiBold" size:16];
return cell;
   

在执行上述所有代码后,我得到了this 形式的结果现在我很困惑如何传递我的第二个视图 xml 文件 url,然后是第三个视图 url。我的 xml 文件是这种格式

第一个xml文件

 <?xml version="1.0" encoding="UTF-8"?>
<Collections> <Collection id="5"><title>Allegroo</title> </Collection>

第二个xml文件

 <?xml version="1.0" encoding="UTF-8"?>
 <Collection id="5"><colletciontitle>Allegroo</colletciontitle>  <weaveimage>"imageurl"   </weaveimage><Rug id="48"><Rugthumb>"firstimageurl"</Rugthumb><RugSku>AL-637</RugSku></Rug><Rug id="51"><Rugthumb>"Secondimageurl"</Rugthumb><RugSku>AL-641</RugSku></Rug>

第三个xml文件

  <?xml version="1.0" encoding="UTF-8"?>
 <Rug id="47"><Rugmainimage>"imageurl"</Rugmainimage> <Rugtitle>AL-636 Aged Indigo / Vintage Beige</Rugtitle> <Rugdiscription>Hand Knotted
  Distressed Wool Pile / Cotton Foundation </Rugdiscription><Availablesizes><Size>10x14</Size><Size>12x15</Size><Size>2x3</Size><Size>3x5</Size><Size>4x6</Size><Size>6x9</Size><Size>8x10</Size><Size>9x12</Size><Runner>2'6"x10'</Runner><Runner>2'6"x12'</Runner><Runner>2'6"x8'</Runner></Availablesizes></Rug>

与我的问题和建议相关的链接或示例代码形式的任何帮助都将受到高度重视。谢谢

【问题讨论】:

最简单的方法是定义一个 int 变量,然后在解析之前检查该变量的值。 你是对的,但我对如何在 AppDelegate 中传递多个 xml 文件 url 感到困惑。 据我所知你的代码。我猜你不需要在 appdelegate 中解析 xml。您可以在您的 viewdidload 中或在选择表格行时执行此操作。您将将该值存储在数组中,您可以在 AppDelegate 中定义并根据您的需要进行修改。 请详细回答我认为您的方法符合我的要求。 【参考方案1】:

嗯,所以定义长话短说,你想按顺序解析多个 url 吗?

这就是答案,

    在 appDelegate 中使用变量/标识符来告诉您正在解析哪个 xml。 使用您的 xml 解析器作为委托类对象

    使用委托方法切换到下一个xml解析

     - (void)parserDidEndDocument:(NSXMLParser *)parser 
         // Change URL accordingly 
         NSURL *url = [[NSURL alloc] initWithString:@"Firstviewxmlurl"];
         NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
         XMLParser *parser = [[XMLParser alloc] initXMLParser];
         [xmlParser setDelegate:parser];
          BOOL success = [xmlParser parse];
    
    

【讨论】:

感谢您的回答,但请您为我简化您的回答,因为我说我的第一个 url 工作并且它现在在 tableview 中显示数据,当我点击 uitableview 的任何一行时,它会在第二个显示数据使用第二个网址查看。【参考方案2】:

我添加了一些代码让您理解。尝试根据您的情况实施。下面的代码仅供参考,因为我没有做出你需要先理解的所有更改,然后相应地实施

//int i = 0;   // in AppDelegate

代码:

//Or ViewDidLoad Method
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

 int = 1;    //For First View
NSURL *url = [[NSURL alloc] initWithString:@"Firstviewxmlurl"];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
XMLParser *parser = [[XMLParser alloc] initXMLParser];
[xmlParser setDelegate:parser];
BOOL success = [xmlParser parse];
if(success)
    NSLog(@"No Errors");
else
    NSLog(@"Error Error Error!!!");
 

XMLParser.m

- (XMLParser *) initXMLParser 
      
      [super init];
      appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
      return self;
    

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
      namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict 

    if([elementName isEqualToString:@"Collections"]) 
   
        //Initialize the array.
      if (int == 1)
        appDelegate.books = [[NSMutableArray alloc] init];

      else if (int == 2)
        appDelegate.secondArray = [[NSMutableArray alloc] init];

      else if (int == 3)
        appDelegate.thirdArray = [[NSMutableArray alloc] init];
    

    else if([elementName isEqualToString:@"Collection"]) 
  
         if (i == 1)
        
          //Initialize the book.
          aBook = [[Book alloc] init];

          //Extract the attribute here.
          aBook.bookID = [[attributeDict objectForKey:@"id"] integerValue];

          NSLog(@"Reading id value :%i", aBook.bookID);
        

         else if (i == 2)
        
           //Second Xml 
        

        else if (i == 3)
       
           //Third Xml
       

    

  NSLog(@"Processing Element: %@", elementName);
 


- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string  
    //Check condition 
    if(!currentElementValue) 
        currentElementValue = [[NSMutableString alloc] initWithString:string];
    else
        [currentElementValue appendString:string];

    NSLog(@"Processing Value: %@", currentElementValue);
    

     - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
       namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
//Check COndition
    if([elementName isEqualToString:@"Collections"])
        return;
    if([elementName isEqualToString:@"Collection"]) 
        [appDelegate.books addObject:aBook];

        [aBook release];
        aBook = nil;
    
    else 
        [aBook setValue:currentElementValue forKey:elementName];

    [currentElementValue release];
    currentElementValue = nil;
      

【讨论】:

嗨,当我在 viewdidload 中调用 url 时,它不会在 tableview 中显示任何数据,我认为 viewdidload 和 tableview 委托方法同时调用,这就是它显示我的书本数组为空的原因。 确保在解析 [tableView reloadData] 后重新加载表;解析完成后检查数组中的值是否有数据。 paste.ubuntu.com/1698042 请检查我的代码我的书数组显示空数据。 您正在显示的书籍数组是此类的一个对象,而您正在其他某个类中解析 xml。你是在这个对象还是这个类中存储值?我不知道。最好在 AppDelegate 中定义该数组。 你似乎不仅对xml而且对xcode也是新的。您需要根据选择的数据,您需要在 tableview didselectrow 的第一类中分配第二类的数组。

以上是关于如何在 iphone 中解析多个 .xml 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 代码中解析多个 xml 文件?

如何在文档中下载和保存 xml,然后如何从文档中解析 xml 文件?

如何将多个 XML 文件解析为多个 CSV 文件?

解析多个xml文件时如何检查空xml文件[重复]

如何解析此 xml 并检索 iPhone 中的数据 [重复]

iPhone - 应用程序启动时保存核心数据会导致多个相同的对象