XMLParser pentru incepatori
  [ Ignoră ]
Avatar
RankRankRankRank
Sr. Member
Din: Bucuresti
Macuser din: 22.09.06

Ieri am rezolvat o mica problema legata de un fisier XML si NSXMLParser si o sa pun aici rezolvarea in caz ca au si altii nevoie.
Pentru a salva datele unui fisier XML de pe un website intr-un array sau dictionar al aplicatiei se creaza un url:

NSURL *url [NSURL URLWithString: @"adresa web cu XML-ul"]


Apoi se creaza un parser:

NSXMLParser *parser [[NSXMLParser alloc] initWithContentsOfURLurl]

Apoi se incepe analiza XML-ului apeland metoda “parse”:

[parser parse]

viewController-ul trebuie sa adopte protocolul NSXMLParser si sa implementeze urmatoarele 3 delegate methods:

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


Metoda este trimisa de catre parser catre delegat cand intalneste inceputul unui tag iar aici putem cauta ceea ce ne trebuie,ex tag-ul “Rate”:

if([elementName compare: @"Rate"== NSOrderedSame)
        
[tempString setString: @""]

tempString este declarat ca NSMUtableString in viewController si la inceputul tag-ului ce il setam @”“.

// metoda 2
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 

Metoda este trimisa de parser pentru a oferi delegatului toate caracterele elementului curent.

[tempString appendStringstring]

trebuie apelata metoda appendString: pentru a adauga caracter cu caracter in tempString deoarece metoda delegat este trimisa de mai multe ori si nu se poate salva direct string-ul.

// metoda 3
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 

Metoda este trimisa de parser catre delegat cand intalneste sfarsitul tag-ului.

if([elementName compare: @"Rate"== NSOrderedSame)
{
   
// se face o copie la tempString pentru a avea alta adresa de memorie.
   // se adauga string-ul in array apoi se elibereaza memoria,deoarece str a fost creat cu metoda mutableCopy.
   
NSMutableString *str [tempString mutableCopy];
   
[array addObjectstr];
   
str release]
 Semnătură 

A man should look for what is, and not for what he thinks should be.—Albert Einstein

Profil
 
  [ Ignoră ]   [ # 1 ]
RankRank
Jr. Member
Din: a fost Iasi
Macuser din: 31.05.08

de ce

if([elementName compare: @"Rate"== NSOrderedSame

si nu

if([elementName isEqualToString:@"Rate"]

???


Apropo , nu uita sa cauti dupa un NSError un cazul in care esueaza parsingul.


Salutari,
StaS

Profil