简体   繁体   English

将XML数据解析为NSMutableArray iOS - iPhone

[英]Parsing XML data to NSMutableArray iOS - iPhone

This is the XML data: 这是XML数据:

<Categorys> 
    <Category>  
        <categoryId>25</categoryId>  
            <categoryName>My Photos</categoryName>                                  
                <categoryDescription>Description</categoryDescription>      
            <categoryIconPath>7.jpg</categoryIconPath>      
            <userId>2</userId>  
            <categoryStatus>ON</categoryStatus>  
        <publicPrivate>Private</publicPrivate>
    </Category>
......more categories
<Categorys>

Here I want to get the <categoryName> values into my NSMutableArray categList . 在这里,我想将<categoryName>值放入我的NSMutableArray categList

The code I have used is: 我使用的代码是:

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

    if ( [elementName isEqualToString:@"categList"]) {
        // addresses is an NSMutableArray instance variable
        if (!categList)
            categList = [[NSMutableArray alloc] init];
        return;
    }

    NSLog(@"StartedElement %@", elementName);

    element = [NSMutableString string];

}


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

    if(element == nil)

        element = [[NSMutableString alloc] init];

        [element appendString:string];

}

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

    NSLog(@"Found an element named: %@ with a value of: %@", elementName, element);

    if ([elementName isEqualToString:@"categoryName"]) {

        NSLog(@"\n\n\nfound::::::::::::::: %@", element);

        category = element;

        NSLog(@"category:::: %@", category);

    }

    [categList addObject:element];
    NSLog(@"categList*************** %@", categList);
}

But I am not getting the category names in my NSMutableArray categList : 但我没有在我的NSMutableArray categList获取类别名称:

Whats wrong in my code? 我的代码有什么问题? :( :(

Thanks 谢谢

Hey You can use XMLReader but it will return NSDictionary . 嘿你可以使用XMLReader,但它会返回NSDictionary

The Following code demo for XMLReader to get NSDictionary . 以下为XMLReader to get NSDictionary代码演示。

import XMLReader in your file. 在文件中导入XMLReader

#import "XMLReader.h"

Then use following method to get NSDictionary . 然后使用以下方法获取NSDictionary Where you have to pass your XML as NSString . 您必须将XML作为NSString传递的位置。

NSDictionary* xmlDict = [XMLReader dictionaryForXMLString:theXML error:&er];

If you want to use GDataXMLParser you can use following code that is working fine 如果您想使用GDataXMLParser,您可以使用以下正常工作的代码

First Impost GDataXMLParser library file then write vbe 首先Impost GDataXMLParser库文件然后写vbe

 -(void)XMLParsing
 {

      GdataParser *parser = [[GdataParser alloc] init];

      NSString* urlString = @"YOURURL"; 

      NSURL *url = [[NSURL alloc] initWithString:urlString];

      [parser downloadAndParse:url withRootTag:@"Category" withTags:[NSDictionary dictionaryWithObjectsAndKeys:@"categoryId",@"categoryId",@"categoryName",@"categoryName",@"categoryDescription",@"categoryDescription",@"categoryIconPath",@"categoryIconPath",@"userId",@"userId",@"categoryStatus",@"categoryStatus",@"publicPrivate",@"publicPrivate",nil] 
                         sel:@selector(finishGetDataSF:) 
                  andHandler:self];
      [urlSR release];
      [parser release];
  } 


  -(void)getDate:(NSDictionary*)dict
  {
      NSLog(@"Data from XML file  ==  %@",dict);

      NSArray* arrayTemp = [dict copy];
  }

here i have parsing of you r Application its working very fine pls check it make a category object orientation class and use it. 在这里,我已经解析了你的应用程序,它的工作非常精细请检查它是否为类别对象定向类并使用它。

 -(void)loaddatafromxml
  {
    NSString *ur=[NSString stringWithFormat:@"Enter your url"]; 

     NSURL *url=[NSURL URLWithString:ur];
     NSMutableURLRequest *req=[NSMutableURLRequest requestWithURL:url];
     conn=[[NSURLConnection alloc]initWithRequest:req delegate:self];
     if(conn)
     webdata=[[NSMutableData data]retain];
  }

 -(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
 {
[webdata appendData:data];
  }
 -(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
  {
[webdata setLength:0];  
   }

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
categaryArry=[[NSMutableArray alloc]init];


  NSString *thexml=[[NSString alloc] initWithBytes:[webdata mutableBytes] length:[webdata length] encoding:NSASCIIStringEncoding];

  NSArray *arr=[thexml componentsSeparatedByString:@"<Category>"];


for(int i=1;i<[arr count];i++)
{
    categList *object = [[categList alloc] init];
    NSString *str=[arr objectAtIndex:i];


    NSArray *arr=[str componentsSeparatedByString:@"<categoryId>"];
    NSString *data=[arr objectAtIndex:1];
    NSRange ranfrom=[data rangeOfString:@"</categoryId>"];
    object.catid=[data substringToIndex:ranfrom.location];





    arr=[str componentsSeparatedByString:@"<categoryName>"];
    data=[arr objectAtIndex:1];
    ranfrom=[data rangeOfString:@"</categoryName>"];
   object.catname=[data substringToIndex:ranfrom.location];



    arr=[str componentsSeparatedByString:@"<categoryDescription>"];
    data=[arr objectAtIndex:1];
    ranfrom=[data rangeOfString:@"</categoryDescription>"];
   object.catdesc=[data substringToIndex:ranfrom.location];






    arr=[str componentsSeparatedByString:@"<categoryIconPath>"];
    data=[arr objectAtIndex:1];
    ranfrom=[data rangeOfString:@"</categoryIconPath>"];
    object.caticon=[data substringToIndex:ranfrom.location];





    arr=[str componentsSeparatedByString:@"<userId>"];
    data=[arr objectAtIndex:1];
    ranfrom=[data rangeOfString:@"</userId>"];
    object.userid=[data substringToIndex:ranfrom.location];





    arr=[str componentsSeparatedByString:@"<categoryStatus>"];
    data=[arr objectAtIndex:1];
    ranfrom=[data rangeOfString:@"</categoryStatus>"];
    object.catstatus=[data substringToIndex:ranfrom.location];





    arr=[str componentsSeparatedByString:@"<publicPrivate>"];
    data=[arr objectAtIndex:1];
    ranfrom=[data rangeOfString:@"</publicPrivate>"];
    object.publicpriv=[data substringToIndex:ranfrom.location];


    [categaryArry addObject:object];
}   

[self.table_data reloadData];

[thexml release];

[connection release];

 }

and call the loaddatafrm xml function as [self loaddatafromxml]; 并将loaddatafrm xml函数调用为[self loaddatafromxml]; its working nice try it . 它的工作很好试试吧。

Thanks 谢谢

You use if ( [elementName isEqualToString:@"categList"])... but I can't find categList name in you XML sample. 你使用if ( [elementName isEqualToString:@"categList"])...但我在你的XML样本中找不到categList名称。 Check please - this can be an issue. 请检查 - 这可能是一个问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM