3 votes

Analyse syntaxique des données XML vers NSMutableArray iOS - iPhone

Ce sont les données 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>

Ici, je veux obtenir le <categoryName> dans mon NSMutableArray categList .

Le code que j'ai utilisé est le suivant :

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

Mais je n'obtiens pas les noms de catégories dans ma page d'accueil. NSMutableArray categList :

Qu'est-ce qui ne va pas dans mon code ? :(

Gracias

7voto

Devang Points 4582

Hé, vous pouvez utiliser XMLReader mais il retournera NSDictionary .

Le code de démonstration suivant pour XMLReader to get NSDictionary .

import XMLReader dans votre fichier.

#import "XMLReader.h"

Ensuite, utilisez la méthode suivante pour obtenir NSDictionary . Où vous devez passer votre XML comme NSString .

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

2voto

iDhaval Points 4221

Si vous voulez utiliser GDataXMLParser, vous pouvez utiliser le code suivant qui fonctionne bien.

D'abord Imposer le fichier de la bibliothèque GDataXMLParser puis écrire 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];
  }

2voto

parag Points 657

J'ai fait une analyse de votre application qui fonctionne très bien. Vérifiez-la et créez une classe d'orientation d'objet de catégorie et utilisez-la.

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

 }

et appelez la fonction xml loaddatafrm comme [self loaddatafromxml] ; cela fonctionne bien, essayez-le.

Gracias

1voto

SVGreg Points 1212

Vous utilisez if ( [elementName isEqualToString:@"categList"])... mais je ne peux pas trouver categList dans votre échantillon XML. Vérifiez s'il vous plaît - cela peut être un problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X