【问题标题】:Parsing XML data to NSMutableArray iOS - iPhone将 XML 数据解析为 NSMutableArray iOS - iPhone
【发布时间】:2012-04-10 16:46:28
【问题描述】:

这是 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>

在这里,我想将&lt;categoryName&gt; 值放入我的NSMutableArray categList

我使用的代码是:

- (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);
}

但我没有在我的NSMutableArray categList 中获得类别名称:

我的代码有什么问题? :(

谢谢

【问题讨论】:

  • 只使用 JSON,开销小,代码少,解析速度更快。

标签: iphone objective-c ios xcode xcode4.2


【解决方案1】:

嘿,你可以使用XMLReader,但它会返回NSDictionary

XMLReader to get NSDictionary 的以下代码演示。

在您的文件中导入XMLReader

#import "XMLReader.h"

然后使用以下方法获取NSDictionary。您必须将XML 传递为NSString .

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

【讨论】:

    【解决方案2】:

    如果您想使用 GDataXMLParser,您可以使用以下运行良好的代码

    首先 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];
      }
    

    【讨论】:

    • 我想用所需的数据填充数组,以便在 tableview 中使用它
    • 我认为你可以做 NSArray* arrayTemp = [dict copy];以此
    【解决方案3】:

    我在这里解析了你的应用程序,它工作得很好,请检查它是否创建了一个面向对象的类别并使用它。

     -(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];
    
     }
    

    并将loaddatafrm xml函数调用为[self loaddatafromxml];效果不错,试试吧。

    谢谢

    【讨论】:

      【解决方案4】:

      您使用 if ( [elementName isEqualToString:@"categList"])...,但我在您的 XML 示例中找不到 categList 名称。请检查 - 这可能是个问题。

      【讨论】:

        猜你喜欢
        • 2012-10-02
        • 2013-02-20
        • 1970-01-01
        • 1970-01-01
        • 2014-10-20
        • 1970-01-01
        • 2015-01-01
        • 2011-09-18
        • 2015-06-30
        相关资源
        最近更新 更多