iCulture forum | iPhone, iPad,  iPod touch, Apple TV en iOS

iCulture forum | iPhone, iPad, iPod touch, Apple TV en iOS (https://forum.iculture.nl/)
-   Ontwikkelen voor iOS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/)
-   -   TBXML Parser Ervaring (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/122325-tbxml-parser-ervaring.html)

gobelz 23-07-12 12:25

TBXML Parser Ervaring
 
Ontwikkelaars,

Ik wil in mijn huidige project maar eens TBXML gebruiken, het schijnt: licht, snel en gebruiksvriendelijk te zijn. Graag wil ik weten wat jullie ervaring met de parser zijn.

Ik heb een XML met bijv.
Code:

<assessmentDetails>
                    <assessment>
                        <assessmentName>Test1</assessmentName>
                        <assessmentType>Coursework</assessmentType>
                        <assessmentWeighting>30</assessmentWeighting> 
                    </assessment>
                </assessmentDetails>

Het lukt mij bovenstaand XML te parsen, geen probleem. Ik schrijf het uit naar een UILabel in mijn project. Ik gebruik geen TableView.

Maar als ik meerdere childs heb met bijv.
Code:

<assessmentDetails>
                    <assessment>
                        <assessmentName>Test1</assessmentName>
                        <assessmentType>Coursework</assessmentType>
                        <assessmentWeighting>30</assessmentWeighting>
                    </assessment>
                    <assessment>
                        <assessmentName>Coursework</assessmentName>
                        <assessmentType>Coursework</assessmentType>
                        <assessmentWeighting>40</assessmentWeighting>
                    </assessment>
                    <assessment>
                        <assessmentName>Test2</assessmentName>
                        <assessmentType>Coursework</assessmentType>
                        <assessmentWeighting>30</assessmentWeighting> 
                    </assessment>
                </assessmentDetails>

Het lukt mij niet om dit over meerdere UILabels uit te schrijven. Zie code:
Code:

TBXMLElement *assessment= [TBXML childElementNamed:@"assessmentName" parentElement:element];
        NSString *name = [TBXML textForElement:assessment];
        label.text = [NSString stringWithFormat:@"%@", name];

Bovenstaand lukt wel voor een enkel, maar als ik hier een tweede UILabel aan zet dan lukt het niet.

Kort: Ik wil met TBXML de drie 'assessmentName' schrijven naar UILabel.

Bedankt!

Nikooos 23-07-12 14:03

Werkt bij mij echt heel fijn. Lekker snel en simpel, hoewel ik tegenwoordig liever JSON gebruik dan XML, maar soms is het niet anders en dan gebruik ik altijd TBXML.

In jouw geval werkt het voor slechts 1 element, omdat je natuurlijk een loopje moet maken. Je voert nu gewoon 1 keer die actie uit, terwijl er misschien wel meerdere elementen zijn.

gobelz 23-07-12 17:21

Do -> While?

Ik ben dat eens tegengekomen op google, maar zonder dat het wordt uitgeschreven naar een UILabel. Dat maakt het juist voor mij, voor nu, moeilijk. Ik ben serieus benieuwd naar een stukje code wat laat zien dat een ander UILabel het 2 element laat zien.

Ik wil dit graag, voor mijzelf vooral, werkend hebben om zo iets anders geleerd te hebben.

Dank voor de reactie

Citaat:

Oorspronkelijk geplaatst door psychonikeo (Bericht 810022)
Werkt bij mij echt heel fijn. Lekker snel en simpel, hoewel ik tegenwoordig liever JSON gebruik dan XML, maar soms is het niet anders en dan gebruik ik altijd TBXML.

In jouw geval werkt het voor slechts 1 element, omdat je natuurlijk een loopje moet maken. Je voert nu gewoon 1 keer die actie uit, terwijl er misschien wel meerdere elementen zijn.


Nikooos 24-07-12 10:03

Het lijkt me sowieso niet handig om direct vanuit de parser in een label te gaan schrijven. Ik doen altijd eerst alle info ophalen, deze in een dictionary zetten en bij meerdere elementen gaat er per element een dictionary in een array.

Die array loop ik dan weer rond om alle informatie daar te zetten waar ik het wil hebben.

dit is mijn code om een RSS feed uit te lezen.

Code:

NSMutableArray *newsArr = [[NSMutableArray alloc] init];

TBXML *tbxml = [TBXML tbxmlWithURL:url];
    TBXMLElement *root = tbxml.rootXMLElement;
    if (root) {
        TBXMLElement *channelElement = [TBXML childElementNamed:@"channel" parentElement:root];
        if (channelElement != nil)  {
            //NSLog(@"channel");
           
            TBXMLElement *loopElement = [TBXML childElementNamed:@"item" parentElement:channelElement];
            if (loopElement != nil) {
                do {
                    NSMutableDictionary *newsDict = [[NSMutableDictionary alloc] initWithCapacity:4];
                   
                    //NSLog(@"nieuwsItem");
                    TBXMLElement *titleElement = [TBXML childElementNamed:@"title" parentElement:loopElement];
                    TBXMLElement *pubDateElement = [TBXML childElementNamed:@"pubDate" parentElement:loopElement];
                    TBXMLElement *contentElement = [TBXML childElementNamed:@"content:encoded" parentElement:loopElement];
                    TBXMLElement *linkElement = [TBXML childElementNamed:@"link" parentElement:loopElement];
                    TBXMLElement *imgElement = [TBXML childElementNamed:@"image" parentElement:loopElement];
                   
                    [newsDict setValue:[TBXML textForElement:titleElement] forKey:@"title"];
                    [newsDict setValue:[TBXML textForElement:pubDateElement] forKey:@"pubDate"];
                    [newsDict setValue:[TBXML textForElement:contentElement] forKey:@"content"];
                    [newsDict setValue:[TBXML textForElement:linkElement] forKey:@"link"];
                    [newsDict setValue:[TBXML textForElement:imgElement] forKey:@"image"];
                   
                    [newsArr addObject:newsDict];
                   
                } while ((loopElement = loopElement->nextSibling));
            }
        }
    }

Dan heb ik dus een array newsArr die gevuld is met een aantal dictionary's newsDict die alle informatie bevatten. Die kan ik dan gemakkelijk in een tabel laten weergeven.
Anders met een loopje de info in labels zetten.

gobelz 24-07-12 12:12

Ik heb hiervoor eens NSXMLParser gebruikt om ook het een en ander naar een paar uilabels te schrijven.

zie onderstaand code:
Code:

//cell-1
            if (counter == 0)
            {
               
                secondTempLabel.text = tempStrToDisp;
               
            }
           
            //cell-2
            if (counter == 1)
            {
               
                tirthTempLabel.text = tempStrToDisp;
            }
           
            //cell-3
            if (counter == 2)
            {
               
                fourthTempLabel.text = tempStrToDisp;
            }
           
            //increment
            //This will only get incremented 4 times
            counter = counter + 1;

Ik kan hieruit meer duidelijkheid trekken dan bij een TBXML. Hier geef ik per laag aan welke laag element ik in een UILabel wil zien. Dit is voor mij duidelijk taal.

Ik kan bij TBXML niet een soortgelijk functie vinden.

Wat ik wel kan met TBXML is dat ik de eerste laag wel kan parsen. Zie code:
Code:

records = [NSMutableArray array];
    [records retain];
   
    TBXML * XML = [[TBXML tbxmlWithURL:[NSURL URLWithString:@"#########.XML"]] retain];
   
    TBXMLElement *rootXML = XML.rootXMLElement;
    TBXMLElement *results = [TBXML childElementNamed:@"kaas" parentElement:rootXML]; 
    TBXMLElement *WOEID = [TBXML childElementNamed:@"kilo" parentElement:results];
    NSString *woeid = [TBXML textForElement:WOEID];
   
   
    [records addObject:[NSArray arrayWithObjects:
                        [TBXML textForElement:WOEID],nil]]; 
   
    tirthTempLabel.text = woeid;


gobelz 25-07-12 00:24

Even een update. Ik heb iets gevonden om een aantal elementen te kunnen tonen in verschillende UILabels. Zie code.

Code:

TBXMLElement *element = [TBXML childElementNamed:@"####" parentElement:root];
   
    int count = 1;
    while (element != nil) {
       
        if (count == 1) {
            TBXMLElement *tempE = [TBXML childElementNamed:@"####" element];
           
            records = [NSMutableArray array];
            [records retain];
           
            [records addObject:[NSArray arrayWithObjects:
                                [TBXML textForElement:tempE],nil]];
           
            NSString *tempe = [TBXML textForElement:tempE];
           
            secondTempLabel.text = tempe;
        }
        if (count == 2) {
            TBXMLElement *tempB = [TBXML childElementNamed:@"####" element];
           
            records = [NSMutableArray array];
            [records retain];
           
            [records addObject:[NSArray arrayWithObjects:
                                [TBXML textForElement:tempB],nil]];
           
            NSString *tempb = [TBXML textForElement:tempB];
           
            tirthTempLabel.text = tempb;
        }
       
        weatherElement = [TBXML nextSiblingNamed:@"####" element];
        count++;
    }

Dit werkt voor mij uitstekend! Graag reacties of opmerkingen. Andere tips?

XIII 25-07-12 00:34

Een flauwe: het Nederlandse "derde" spel je in het Engels "third", niet "tirth"...

gobelz 25-07-12 00:46

Thanks, ik heb het aangepast! Kan gebeuren.

Citaat:

Oorspronkelijk geplaatst door XIII (Bericht 810260)
Een flauwe: het Nederlandse "derde" spel je in het Engels "third", niet "tirth"...


gobelz 26-07-12 14:12

JSON? Hoe gebruik je het? Wat is je ervaring.

Kan je het meer toelichten..


Citaat:

Oorspronkelijk geplaatst door psychonikeo (Bericht 810022)
Werkt bij mij echt heel fijn. Lekker snel en simpel, hoewel ik tegenwoordig liever JSON gebruik dan XML, maar soms is het niet anders en dan gebruik ik altijd TBXML.

In jouw geval werkt het voor slechts 1 element, omdat je natuurlijk een loopje moet maken. Je voert nu gewoon 1 keer die actie uit, terwijl er misschien wel meerdere elementen zijn.



Alle tijden zijn GMT +2. Het is nu 18:00.