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/)
-   -   XML in een plist file (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/34379-xml-plist-file.html)

ulquiorra 19-05-09 17:19

XML in een plist file
 
Beste mensen ,

Ik heb een xmlbestand van ongeveer 600 regels gekregen en ik zou deze als het mogelijk is graag in een plist file willen zetten. Weet iemand of er een converter of iets dergelijks bestaat die dit voor mij kan genereren, anders ben ik bang dat ik alles moet gaan overschrijven van mijn originele xml naar de property list ( er is dus wel een converter van plist naar xml beschikbaar die heb ik ook , alleen andersom dus niet? ).

danielpunt 19-05-09 18:39

Dat lijkt mij niet zo heel erg veel werk om zelf te schrijven. Plists zijn namelijk XML's, alleen iets anders opgemaakt :)

Malork 19-05-09 21:12

Ik weet niet hoe groot je kennis van PHP is, maar ik heb zoiets in PHP gemaakt mbv simpleXML. deze leest de realm-status van World of Warcraft als XML-feed, en zette deze om in een plist. Ik was al vergevorderd met zo'n soort App, maar sinds kort heeft Blizzard nagenoeg alle WoW-Apps van de App-store weggehaald dmv een 'Cease & desist' dus mijn App zal er nooit komen :(.

de hele code die ik (snel) in elkaar heb gezet toendertijd is hieronder; wees vrij om hem te gebruiken. Hij kan sneller / makkelijker, maar ik moest toen ook even snel iets hebben.

Code:

<?php
$blizzardXML = "http://www.wow-europe.com/realmstatus/index.xml";
$getStatus = new getRealmStatus($blizzardXML);
if($getStatus->error) {
        // kort-door-de-bocht melding, misschien ooit nog eens uitwerken
        echo "er was een fout tijdens het ophalen van de rss-feed. server offline?";
} else {
                header('content-Type: text/xml; charset=ISO-8859-1');
        echo $getStatus->plist;
}

class getRealmStatus {
        private $xmlFile = "";
        private $xml              = array();
        private $languages = array();
        private $realms          = array();
        public $plist = '';
        public $error = 0;
        private $languageArr = array();
       
        public function __construct($xmlFileOrURL) {
                $this->xmlFile = $xmlFileOrURL;
                $this->languageArr['en'] = "English Speaking realms";
                $this->languageArr['de'] = "German Speaking realms";
                $this->languageArr['fr'] = "French Speaking realms";
                $this->languageArr['es'] = "Spanish Speaking realms";
                $this->languageArr['ru'] = "Russian Speaking realms";
               
                $this->retrieveXML();               
        }
        private function retrieveXML() {
                $test = file_get_contents($this->xmlFile);
                $test = str_replace('&nbsp;',' ',$test);               
                $this->xml = simplexml_load_string($test);
                if($this->xml) {
                        /* connection / parsing succesful; continue */
                        $this->createPlist();
                } else {
                        /* error connecting! */
                        $this->error = 1;
                        return;                       
                }
        }
       
        private function createPlist() {
                $this->getRealms();                       
        }
       
        private function getAlertMessage() {
                /* TO BE IMPLEMENTED! FIRST ITEM IN XML IS ALERT MESSAGE */
        }
       
        /* count the number of items and retrieve the language for the realm, store it as a key */
        private function getRealms() {
                $itemCount = count($this->xml->channel->item)-1;
                for($i=1;$i<$itemCount;$i++) {        // skip $i=0 because that's the alert-item for the realm status */
                                $realmItem = $this->xml->channel->item[$i];
                                $realm = array();
                                $realm['name']                  = (string)$realmItem->title;
                                $realm['status']        = '';
                                $realm['language']          = '';
                                $realm['type']                  = '';
                                $realm['population'] = '';
                                $realm['queue']                = '';
                                $realmPopulation = '';
                                /* walk through attributes of 'category' to get the right information */
                                for($x=0;$x<count($realmItem->category);$x++) {
//                                        echo $realmItem->category[$x]['domain']."<br />";
                                        $domain = (string)strtolower($realmItem->category[$x]['domain']);
                                        $value = (string)$realmItem->category[$x];
                                        $realm[$domain] = $value;// $realmItem->category;
                                }
                                $this->languages[$realm['language']][] = $realm;
                }
                $this->buildPlist();
        }
       
        /* build the .plist for the app to be read properly */
        private function buildPlist() {
                $data = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
XML;
                $keyCount = 1;
                foreach($this->languages as $key => $value) {
                        $data .= "<key>".$this->languageArr[$key]."</key>\r\n";
                        $data .= "<array>\r\n";
                        foreach($value as $realm) {
                          $data .= "<dict>\r\n";
                          foreach($realm as $realmKey => $realmString) {
                                         
                                  $data .= "<key>".$realmKey."</key>\r\n";
                                  $data .= "<string>".$realmString."</string>\r\n";
                                 
                          }
                          $data .= "</dict>\r\n";
                        }
                        $data .= "</array>\r\n";
                }
                $data .= "</dict>\r\n";
                $data .= "</plist>\r\n";
                $this->plist = $data;
        }
}
?>


gekkepietje 19-05-09 21:23

Waarom wil je hem in een plist file zetten?

Myrdhin 19-05-09 22:02

Citaat:

Oorspronkelijk geplaatst door gekkepietje (Bericht 287802)
Waarom wil je hem in een plist file zetten?

Een plist kan je als je 'm goed aanmaakt rechtstreeks in een NSDictionary object laden en raadplegen. Dus geen gedoe met XML parsing.

Malork 19-05-09 23:13

Citaat:

Oorspronkelijk geplaatst door Myrdhin (Bericht 287809)
Een plist kan je als je 'm goed aanmaakt rechtstreeks in een NSDictionary object laden en raadplegen. Dus geen gedoe met XML parsing.

exactemundo :)

danielpunt 20-05-09 00:26

Zo heel erg veel gedoe is het ook weer niet. En de NSXMLParser is echt niet zo heel erg moeilijk, en best wel snel :) Zo hoeft de data niet eerst door jouw server opgehaald, dan geparsed worden en daarna aan de iPhone doorgeven.

Hier heb je een voorbeeld:
codesofa Make NSXMLParser your friend..

Overigens, als ik een XML naar plist converter zou schrijven zou ik het wel iets abstracter aanpakken, zodat je het eventueel later nog kan gebruiken of delen met anderen :)

Myrdhin 20-05-09 08:13

Citaat:

Oorspronkelijk geplaatst door danielpunt (Bericht 287869)
Zo heel erg veel gedoe is het ook weer niet. En de NSXMLParser is echt niet zo heel erg moeilijk, en best wel snel :) Zo hoeft de data niet eerst door jouw server opgehaald, dan geparsed worden en daarna aan de iPhone doorgeven.

Zoveel gedoe is het ook niet, maar als je toch zelf de data samenstelt kan je het natuurlijk net zo goed in een voor de iPhone direct leesbaar formaat doen.

danielpunt 20-05-09 11:10

Dan kan het handig zijn, maar dat is niet het geval bij het script van Malork :)

Malork 20-05-09 12:36

Citaat:

Oorspronkelijk geplaatst door danielpunt (Bericht 287899)
Dan kan het handig zijn, maar dat is niet het geval bij het script van Malork :)

see the bigger picture ;). met dat scriptje kun je snel iets omzetten en oplaan als .plist. Dat scriptje aanpassen naar eigen wens is minder werk dan 600 regels XML omschrijven.

Ik had dat scriptje toendertijd ook gemaakt om niet de gehele RSS-feed binnen te halen met info die ik niet gebruik, dit om overhead op de gebruiker's iPhone te voorkomen.

ulquiorra 20-05-09 17:14

Super thanks allemaal people,,

Citaat:

Met dat scriptje kun je snel iets omzetten en oplaan als .plist. Dat scriptje aanpassen naar eigen wens is minder werk dan 600 regels XML omschrijven.
Mijn punt precies ;)
Malork ik denk dat ik zeker een stuk van je code ga overnemen thanks

danielpunt 22-05-09 14:51

Citaat:

Oorspronkelijk geplaatst door Malork (Bericht 287909)
see the bigger picture ;). met dat scriptje kun je snel iets omzetten en oplaan als .plist. Dat scriptje aanpassen naar eigen wens is minder werk dan 600 regels XML omschrijven.

Ik had dat scriptje toendertijd ook gemaakt om niet de gehele RSS-feed binnen te halen met info die ik niet gebruik, dit om overhead op de gebruiker's iPhone te voorkomen.

Het ligt inderdaad aan waar voor je het gebruikt, maar in veel gevallen prefereer ik toch een XML parsen boven zelf een plist genereren. :) Eigenlijk heb ik nog het liefst JSON.

ulquiorra 26-05-09 17:49

1 Bijlage(n)
Ik heb voor een andere aanpak gekozen, gezien de eerste niet mocht van mijn stagebegeleider.
Ik zat te denken aan xpath en xquery. Wat ik wil is het volgende , ik ben benieuwd of het mogelijk is maar het lijkt me eigenlijk van wel. Ik ben behoorlijk nieuw met Cocoa en Objective C so bear with me ;).

Ik wil dus graag met behulp van xpath of xquery alle waarden die ik nodig heb in een verschillende arrays opslaan ( het zijn allemaal strings) en deze weer gebruiken in mijn tableview.
vb.
xml bestand ( klein stuk uit xml , zo zit het in elkaar , heb zelf niet gemaakt en kan /mag deze ook niet aanpassen )
<oefening>

<exercise id="CW002" type="1" name="Lunge" met="2.0">
<menu_mob>
<menuitem id="1" text="training" pic="workout"/>
<menuitem id="2" text="site online" pic="online"/>
<menuitem id="3" text="Instellingen" pic="settings"/>
</menu_mob>

<workout_iphone name="middag workout" location="home" equipment="none" level="Beginner" time="7" id="MHXB7">
<exerciseref id="CW002"/>
</workout_iphone>

</oefening>





ik dacht er dus aan met behulp van dus xpath/xquery mijn strings uit de xml te halen op te slaan in arrays (dus bv. van menu_mob in een aparte array zodat dit voor het eerste scherm is , en van workout_iphone in een andere.)
En deze dan bij viewDidLoad initWithObjects in te laden.
vb.
-(void)viewDidLoad {
NSArray *array =[[NSarray alloc] initWithObjects:@"ochtend",@"middag"; <-- strings uit array komen
self.list = array;
etc etc.
}


Mijn vraag aan jullie is dit mogelijk if so hoe realiseer ik dit het beste , en als niet teveel gevraagd is ;) een stukje sample code of referentie ernaar would be excellent , ik voel me namelijk nog lange niet thuis in objective c.
Mocht het niet duidelijk zijn stuur me een pm of reageer hier dan maak ik uitgebreidere schema's mochten jullie willen helpen.

ohja heb even een klein schema eronder zodat men ongeveer begrijpt wat er moet gebeuren.


Alle tijden zijn GMT +2. Het is nu 22:16.