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] initWithContentsOfURL: url];
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 appendString: string];
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 addObject: str];
str release];
}