Salut! Pentru a avea access la toate optiunile forumului trebuie sa te inregistrezi aici!
Results 1 to 6 of 6

Thread: NSXMLParser

  1. #1
    iDevice Master Array boboc's Avatar
    Posts
    431
    Feedback Score
    0
    Thumbs Up/Down
    Received: 6/3
    Given: 0/0
    Rep Power
    10

    0 Not allowed! Not allowed!

    NSXMLParser

    Ieri am rezolvat o mica problema legata de un fisier XML 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:

    Code:
     NSURL *url = [NSURL URLWithString: @"adresa web cu XML-ul"];
    Apoi se creaza un parser:

    Code:
     NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL: url];
    Apoi se incepe analiza XML-ului apeland metoda "parse":

    Code:
     [parser parse];
    viewController-ul trebuie sa adopte protocolul NSXMLParser si sa implementeze urmatoarele 3 delegate methods:

    Code:
    // 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":

    Code:
     if([elementName compare: @"Rate"] == NSOrderedSame)
    		[tempString setString: @""];
    tempString este declarat ca NSMUtableString in viewController si la inceputul tag-ului ce il setam @"".

    Code:
    // metoda 2
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    Metoda este trimisa de parser pentru a oferi delegatului toate caracterele elementului curent.

    Code:
    [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.

    Code:
    // 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.

    Code:
    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]; 
    }
    A man should look for what is, and not for what he thinks should be.—Albert Einstein

  2. #2
    Proaspat posesor de iDevice Array
    Location
    Madrid
    Posts
    8
    Feedback Score
    0
    Thumbs Up/Down
    Received: 0/0
    Given: 0/0
    Rep Power
    0

    0 Not allowed! Not allowed!
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL: url];
    Daca faci chestia asta in main thread , iti blocheaze UI'ul pe durata descarcarii.
    Toate descarcarile ar trebui sa se faca asincron.

    [elementName compare: @"Rate"] == NSOrderedSame
    de ce nu [elementName isEqualToString:@"Rate"]?

    NSMutableString *str = [tempString mutableCopy];
    un copy simplu e sufucient, se presupune ca nu ai sa modifici stringul dupa ce parsezi XML-ul


    Anyway ... e foarte bine ca postezi aceste kestii , poate asa incepe sa se miste treaba cu programarea pt iOS si in Ro.

  3. #3
    iDevice Master Array boboc's Avatar
    Posts
    431
    Feedback Score
    0
    Thumbs Up/Down
    Received: 6/3
    Given: 0/0
    Rep Power
    10

    0 Not allowed! Not allowed!
    @StaS de curiozitate am creat o noua metoda startParser in care am mutat alocarea url-ului si a parser-ului si in care apelez [parser parse].
    Am creat si un NSAutoreleasePool iar in viewDidLoad am apelat:

    Code:
     [self performSelectorInBackground: @selector(startParser) withObject: nil];
    Am verificat cu instruments si exista memory leaks,si imi indica 97% din leaks spre:

    Code:
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL: url];
    Ai idee de ce?
    A man should look for what is, and not for what he thinks should be.—Albert Einstein

  4. #4
    Proaspat posesor de iDevice Array
    Location
    Madrid
    Posts
    8
    Feedback Score
    0
    Thumbs Up/Down
    Received: 0/0
    Given: 0/0
    Rep Power
    0

    0 Not allowed! Not allowed!
    Eu de obicei fac doar downloadul intr'un thread separat , parsingul il fac in main.

  5. #5
    iDevice Master Array boboc's Avatar
    Posts
    431
    Feedback Score
    0
    Thumbs Up/Down
    Received: 6/3
    Given: 0/0
    Rep Power
    10

    0 Not allowed! Not allowed!
    Inteleg,probabil ca parsingul nu dureaza mult daca XML-ul este downloadat.
    La mine am vazut care era si problema cu leak-ul.
    In didStartElement: eu aveam asa:

    Code:
    tempKey = [attributeDict objectForKey: @"currency"];
    si trebuia asa:

    Code:
     self.tempKey = [attributeDict objectForKey: @"currency"];
    daca nu folosesc self. nu se apeleaza si setter-ul deci prin urmare nici retain.
    Acum vad ca Instruments arata totul ok.
    A man should look for what is, and not for what he thinks should be.—Albert Einstein

  6. #6
    Proaspat posesor de iDevice Array
    Location
    TM
    Posts
    1
    Feedback Score
    0
    Thumbs Up/Down
    Received: 0/0
    Given: 0/0
    Rep Power
    0

    0 Not allowed! Not allowed!

    Modificare XML (DOM like)

    Salut ! Imi poate cineva sugera o modalitate de a prelucra un fisier XML in iOS asa cum se poate de exemplu in java cu DOM ...
    SAX permite modificarea ?

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •