Une des tâches simples qui constitue l’épine dorsale de nombreuses applications est la possibilité d’analyser des fichiers XML. Et, heureusement, Xcode facilite l’analyse d’un fichier XML dans Objective-C.
Un fichier XML peut contenir n'importe quoi, des données de base sur votre application à un flux RSS pour un site Web. Ils peuvent également constituer un excellent moyen de mettre à jour les informations de votre application à distance, évitant ainsi de soumettre un nouveau fichier binaire à Apple simplement pour ajouter un nouvel élément à une liste.
Alors, comment traitons-nous les fichiers XML dans Xcode? Le processus contient des étapes pour initialiser les variables à utiliser, pour démarrer le processus d'analyse XML, alimenter ce processus en fichier, le début d'un élément individuel, les caractères (valeur) dans l'élément, la fin d'un élément individuel et la fin. du processus d'analyse.
Dans cet exemple, nous analyserons un fichier provenant d'Internet en lui transmettant une adresse Web particulière (URL).
Nous allons commencer par construire le fichier d'en-tête. Voici un exemple de fichier d'en-tête très basique pour un contrôleur de vue de détail avec la configuration minimale requise pour l'analyse de notre fichier:
@interface RootViewController: UITableViewController {DetailViewController * detailViewController;NSXMLParser * rssParser;Articles NSMutableArray *;NSMutableDictionary * item;NSString * currentElement;NSMutableString * ElementValue;BOOL errorParsing;}@property (nonatomic, keep) IBOutlet DetailViewController * detailViewController;- (void) parseXMLFileAtURL: (NSString *) URL;La fonction parseXMLFileAtURL lancera le processus pour nous. Quand il aura fini, les "articles" NSMutableArray contiendront nos données. Le tableau sera constitué de dictionnaires mutables avec des clés liées aux noms de champs dans le fichier XML. Maintenant que nous avons défini les variables nécessaires, nous allons passer à la réunion du processus dans le fichier .m:
- (void) parserDidStartDocument: (NSXMLParser *) parser {NSLog (@ "Fichier trouvé et analyse commencée");} Cette fonction est exécutée au début du processus. Il n’est pas nécessaire de mettre quoi que ce soit dans cette fonction, mais si vous voulez effectuer une tâche lorsque le fichier commence à être analysé, c’est là que vous placerez votre code.
- (void) parseXMLFileAtURL: (NSString *) URL{NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; fr-fr) AppleWebKit / 525.27.1 (KHTML, comme Gecko) Version / 3.2.1 Safari / 525.27.1";NSMutableURLRequest * request = NSMutableURLRequest requestWithURL:NSURL URLWithString: URL;request setValue: agentString forHTTPHeaderField: @ "User-Agent";xmlFile = NSURLConnection sendSynchronousRequest: demande retournantResponse: nil erreur: nil;articles = NSMutableArray alloc init;errorParsing = NO;rssParser = NSXMLParser alloc initWithData: xmlFile;rssParser setDelegate: self;// Il est possible que vous deviez activer certaines d'entre elles en fonction du type de fichier XML que vous analysez.rssParser setShouldProcessNamespaces: NO;rssParser setShouldReportNamespacePrefixes: NO;rssParser setShouldResolveExternalEntities: NO;rssParser parse;} Cette fonction demande au moteur de télécharger un fichier à une adresse Web particulière (URL) et de lancer le processus d’analyse. Nous disons au serveur distant que nous sommes un Safari fonctionnant sur Mac au cas où le serveur essaie de rediriger l'iPhone / iPad vers une version mobile.Les options à la fin sont spécifiques à certains fichiers XML. La plupart des fichiers RSS et des fichiers XML génériques n'auront pas besoin d'être activés.
- (void) analyseur: (NSXMLParser *) analyseur parseErrorOccur: (NSError *) parseError {NSString * errorString = NSString stringWithFormat: @ "Code d'erreur% i", code parseError;NSLog (@ "Erreur lors de l'analyse de XML:% @", errorString);errorParsing = YES;}Il s’agit d’un routage simple de vérification des erreurs qui définira une valeur binaire s’il rencontre une erreur. Vous aurez peut-être besoin de quelque chose de plus spécifique, selon ce que vous faites. Si vous devez simplement exécuter du code après traitement en cas d'erreur, la variable binaire errorParsing peut être appelée à ce moment-là.
- (void) analyseur: (NSXMLParser *) analyseur didStartElement: (NSString *) nomName namespaceURI: (NSString *) namespaceURI nom qualifié: (NSString *) qName attributs: (NSDictionary *) attributDict {currentElement = copie NomElément;ElementValue = NSMutableString alloc init;if (elementName isEqualToString: @ "item") {item = NSMutableDictionary alloc init;}} La viande de l'analyseur XML contient trois fonctions: une qui s'exécute au début d'un élément individuel, une qui s'exécute au milieu de l'analyse de l'élément et une qui s'exécute à la fin de l'élément. Pour cet exemple, nous analyserons un fichier similaire aux fichiers RSS qui décomposent les éléments en groupes sous le titre "éléments" du fichier XML. Au début du traitement, nous recherchons le nom d'élément "item" et allouons notre dictionnaire d'éléments lorsqu'un nouveau groupe est détecté. Sinon, nous initialisons notre variable pour la valeur.
- analyseur (void): analyseur (NSXMLParser *) trouvéCharacters: (NSString *) string {ElementValue appendString: string;} C'est la partie facile. Lorsque nous trouvons des caractères, nous les ajoutons simplement à notre variable "ElementValue".
- (void) analyseur: (NSXMLParser *) analyseur didEndElement: (NSString *) nomName namespaceURI: (NSString *) namespaceURI nom qualifié: (NSString *) qName {if (elementName isEqualToString: @ "item") {articles addObject: item copy;} autre {item setObject: ElementValue forKey: elementName;}} Lorsque nous avons fini de traiter un élément, nous devons procéder de l'une des manières suivantes: (1) si l'élément final est "item", nous avons terminé notre groupe, nous allons donc ajouter notre dictionnaire à notre tableau d'articles. ". Ou (2) si l'élément n'est pas "item", nous allons définir la valeur dans notre dictionnaire avec une clé qui correspond au nom de l'élément. (Cela signifie que nous n’avons pas besoin d’une variable individuelle pour chaque champ du fichier XML. Nous pouvons les traiter un peu plus dynamiquement.)
- (void) parserDidEndDocument: (NSXMLParser *) parser {if (errorParsing == NO){NSLog (@ "Traitement XML terminé!");} autre {NSLog (@ "Une erreur s'est produite lors du traitement XML");}} C'est la dernière fonction nécessaire à notre routine d'analyse. Cela termine simplement le document. Vous allez mettre le code que vous voulez pour terminer le processus ici ou quelque chose de spécial que vous voudrez peut-être faire en cas d'erreur. Une chose que de nombreuses applications pourraient vouloir faire ici est de sauvegarder les données et / ou le fichier XML dans un fichier sur le périphérique. Ainsi, si l'utilisateur n'est pas connecté à Internet lors du prochain chargement de l'application, il peut toujours accéder à ces informations. Bien sûr, nous ne pouvons pas oublier la partie la plus importante: demander à votre application d’analyser le fichier (et de lui donner une adresse Web pour le trouver à!). Pour démarrer le processus, vous devez simplement ajouter cette ligne de code à l'endroit approprié où vous souhaitez effectuer le traitement XML:
self parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml";