Parser XML
  [ Ignoră ]
Avatar
RankRankRank
Member
Din: Ploiesti
Macuser din: 06.12.11

Incerc de citeva zile sa populez UITableView cu informatii returnate de WebService php in format XML .
Nu stiu din ce cauza ,

[attributeDict valueForKey:@"xxx"

returneaza nil ( unde xxx este egal cu cod , cod_categorie si denumire ).

XML-ul are forma si continutul de mai jos .

<posts><post><cod>407</cod><cod_categorie>0</cod_categorie><denumire>Reduceri Stocuri limitate</denumire></post><post><cod>200</cod><cod_categorie>0</cod_categorie><denumire>Produse pentru copii</denumire></post><post><cod>398</cod><cod_categorie>0</cod_categorie><denumire>Produse tutun</denumire></post></posts

codul cu buba este acesta :

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    
    
if([operationName isEqualToString:@"categ"])
 
{
    
if([elementName isEqualToString:@"cod"])
    
{
    getCat 
*tempEntity [[getCat alloc] init];
    
tempEntity.cod [attributeDict valueForKey:@"cod"];
    
tempEntity.cod_categorie [attributeDict valueForKey:@"cod_categorie"];
    
tempEntity.denumire [attributeDict valueForKey:@"denumire"];
    
[tempArray addObject:tempEntity];
    
}
  }

tempArray are numarul de rinduri corect ( semn ca if([elementName isEqualToString:@“cod”]) = True , de unde trag concluzia ca elementName isi face treaba ) 

tempEntity

#import "getCat.h"
@implementation getCat
@synthesize cod,cod_categorie,denumire;
@
end 

#import <Foundation/Foundation.h>

@interface getCat NSObject {
    NSString 
*cod;
    
NSString *cod_categorie;
    
NSString *denumire;
    
}
@property(nonatomic,copyNSString *cod,*cod_categorie,*denumire;;

@
end 

Stie cineva unde gresesc ? Este formatul XML corect ?

Multumesc

 Semnătură 


MacBook Pro 15”  i7 2.2GHz/ 16GB/ 500GB SSD ,  10.11
MacBook Air 13”  i5 1.3GHz/ 4GB/ 256GB SSD ,  10.11

Profil
 
  [ Ignoră ]   [ # 1 ]
Avatar
RankRankRankRank
Moderator
Din: Cluj-Napoca
Macuser din: 26.01.06

Ar trebui sa folosesti didEndElement, pentru ca atunci sunt datele disponibile. Niste nslog-uri cred ca ar lamuri ce se intampla pe acolo.

 Semnătură 

Mcintoshing…

Profil
 
  [ Ignoră ]   [ # 2 ]
Avatar
RankRankRank
Member
Din: Ploiesti
Macuser din: 06.12.11

Multumesc , ai avut dreptate , pentru forma de xml generata aveam nevoie didEndElement .

Ca sa imi fie mai usor am modificat xml-ul ( ca sa nu mai folosesc didEndElement si foundCharacters )
Acum are aceasta forma

<posts>
<
post cod="407" cod_categorie="0" denumire="Reduceri - Stocuri limitate" ></post>
<
post cod="185" cod_categorie="0" denumire="Alimentare" >
<
post cod="398" cod_categorie="0" denumire="Produse tutun" ></post>
</
posts

si este suficient ca in didStartElement sa ai codul de mai jos

- (void)parser:(NSXMLParser *)parser didStartElement :(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    
if ([operationName isEqualToString: @"categ"]){
        
if ([elementName isEqualToString:@"post"]{
            getCat 
*tmpEntity [[getCat alloc] init];
            
tmpEntity.cod [attributeDict valueForKey:@"cod"];
            
tmpEntity.cod_categorie [attributeDict valueForKey:@"cod_categorie"];
            
tmpEntity.denumire [attributeDict valueForKey:@"denumire"];
            
[tempArray addObject:tmpEntity];
        
}
    }

Am abordat aceasta metoda din comoditate si functioneaza ok .
Pentru cei care nu au posibilitatea sa modifice sursa XML , solutia este cea cu didEndElement .

O zi buna.

 Semnătură 


MacBook Pro 15”  i7 2.2GHz/ 16GB/ 500GB SSD ,  10.11
MacBook Air 13”  i5 1.3GHz/ 4GB/ 256GB SSD ,  10.11

Profil
 
  [ Ignoră ]   [ # 3 ]
RankRank
Jr. Member
Din: 
Macuser din: 15.04.08
NaspaNick - 10 Ianuarie 2012 12:18 PM

Multumesc , ai avut dreptate , pentru forma de xml generata aveam nevoie didEndElement .

Ca sa imi fie mai usor am modificat xml-ul ( ca sa nu mai folosesc didEndElement si foundCharacters )
Acum are aceasta forma

<posts>
<
post cod="407" cod_categorie="0" denumire="Reduceri - Stocuri limitate" ></post>
<
post cod="185" cod_categorie="0" denumire="Alimentare" >
<
post cod="398" cod_categorie="0" denumire="Produse tutun" ></post>
</
posts

si este suficient ca in didStartElement sa ai codul de mai jos

- (void)parser:(NSXMLParser *)parser didStartElement :(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    
if ([operationName isEqualToString: @"categ"]){
        
if ([elementName isEqualToString:@"post"]{
            getCat 
*tmpEntity [[getCat alloc] init];
            
tmpEntity.cod [attributeDict valueForKey:@"cod"];
            
tmpEntity.cod_categorie [attributeDict valueForKey:@"cod_categorie"];
            
tmpEntity.denumire [attributeDict valueForKey:@"denumire"];
            
[tempArray addObject:tmpEntity];
        
}
    }

Am abordat aceasta metoda din comoditate si functioneaza ok .
Pentru cei care nu au posibilitatea sa modifice sursa XML , solutia este cea cu didEndElement .

O zi buna.

daca tot ai posibilitatea de a modifica formatul pe server, de ce nu folosesti json si SBJSon pentru a-l parsa. Mi se pare mult mai comod si mai flexibil (sau cel putin XML cu un parser dom, nu sax).

 Semnătură 

MBP | MBA | Iphone 6+ | Ipad 3

Profil
 
  [ Ignoră ]   [ # 4 ]
Avatar
RankRankRank
Member
Din: Ploiesti
Macuser din: 06.12.11

procedura de pe server , functie de parametru returneaza si json care arata asa

{"posts":[
{
"post":{"cod":"407","cod_categorie":"0","denumire":"Reduceri - Stocuri limitate"}},
{"post":{"cod":"185","cod_categorie":"0","denumire":"Alimentare"}},
{"post":{"cod":"398","cod_categorie":"0","denumire":"Produse tutun"}}
]} 

acum sunt in faza de cercetare si o sa incerc json chiar astazi .
Deoarece sunt puturos , incerc totate metodele si care necesita cel mai mic efort va fi pusa in aplicare in proiectele viitoare raspberry

 Semnătură 


MacBook Pro 15”  i7 2.2GHz/ 16GB/ 500GB SSD ,  10.11
MacBook Air 13”  i5 1.3GHz/ 4GB/ 256GB SSD ,  10.11

Profil
 
  [ Ignoră ]   [ # 5 ]
Avatar
RankRankRankRank
Moderator
Din: Cluj-Napoca
Macuser din: 26.01.06

json e mult mai simplu, mergi pe el.

 Semnătură 

Mcintoshing…

Profil