Avant de travailler plus avec libxml, nous allons parler de services Web. Les services Web sont une bonne application pratique de XML et, il me semblerait, de nombreuses applications de l'iPhone aura besoin pour travailler en tant que clients de services Web, de sorte qu'il apparaît comme un détour bien.
La meilleure façon d'accéder aux services Web à partir d'Objective-C est en exploitant les fonctionnalités trouvées dans les services de base, un cadre qui est disponible dans les deux Cocoa et Cocoa Touch. Pour les deux plates-formes dont il a besoin d'être manuellement liés à votre projet car il n'est pas inclus par défaut dans les modèles de Xcode.
Pour un projet de cacao, il suffit de sélectionner des projets -> Ajouter au projet ... puis ajouter le cadre trouvés à l'adresse suivante à votre projet, en veillant à décocher la case "copier dans votre dossier de projet" option:
Maintenant, une fois que vous avez le cadre Core Services inclus dans votre projet, comment l'utilisez-vous? Eh bien, si le service Web auquel vous voulez accéder a un WSDL alors il est vraiment très facile. Dans le cadre de l'installation de l'outil développeur, un utilitaire de petite ligne de commande a été installé sur votre machine appelée WSMakeStubs qui va générer les talons avec toutes les méthodes dont vous avez besoin pour accéder à ce service web. Pour un projet de cacao, la façon de l'utiliser est la suivante:
Mais que faisons-nous dans ce cas puisque nous avons un type complexe? Eh bien, malheureusement, nous avons à lire la documentation et fouiller les talons et d'expérimenter un peu. Dans de nombreux cas, des objets complexes s'attendre à une NSDictionary avec le nom de balise XML utilisé comme clé et le contenu de la balise que l'objet correspondant. Pour les types complexes où il ya des balises imbriquées, certains des objets dans le NSDictionary vous créez peuvent être eux-mêmes NSDictionary instances. Pour cette raison, la construction de votre objecs paramètre peut devenir assez complexe dans certains cas.
Après l'exécution de ce code, result sera une chaîne qui contient le XML avec des balises représentant la longitude et la latitude pour chacun des codes postaux passé po Blogger ne me laisse pas coller cette XML - elle garde la pensée de l'XML est HTML et si je change les étiquettes à utiliser> et < it helpfully converts those back to angle brackets. *sigh* Well, the price is right. Anyway, you can see the XML here si vous voulez.
La meilleure façon d'accéder aux services Web à partir d'Objective-C est en exploitant les fonctionnalités trouvées dans les services de base, un cadre qui est disponible dans les deux Cocoa et Cocoa Touch. Pour les deux plates-formes dont il a besoin d'être manuellement liés à votre projet car il n'est pas inclus par défaut dans les modèles de Xcode.
Pour un projet de cacao, il suffit de sélectionner des projets -> Ajouter au projet ... puis ajouter le cadre trouvés à l'adresse suivante à votre projet, en veillant à décocher la case "copier dans votre dossier de projet" option:
/Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/CoreServices.frameworkPour l'iPhone, eh bien, vous aurez besoin de comprendre que l'on vous; j'ai déjà eu des démêlés avec Apple une fois pour dire aux gens où il est, mais si vous utilisez Spotlight, vous devriez être capable de le trouver sans trop de difficulté .
Maintenant, une fois que vous avez le cadre Core Services inclus dans votre projet, comment l'utilisez-vous? Eh bien, si le service Web auquel vous voulez accéder a un WSDL alors il est vraiment très facile. Dans le cadre de l'installation de l'outil développeur, un utilitaire de petite ligne de commande a été installé sur votre machine appelée WSMakeStubs qui va générer les talons avec toutes les méthodes dont vous avez besoin pour accéder à ce service web. Pour un projet de cacao, la façon de l'utiliser est la suivante:
WSMakeStubs -x ObjC -name MyClassFileName -url http://server:port/path/to/wsdlAlors, disons que nous voulions créer des stubs pour accéder au National Weather Service. Pour cela, vous tapez ceci:
WSMakeStubs -x ObjC -name WeatherService -url http://www.weather.gov/forecasts/xml/DWMLgen/wsdl/ndfdXML.wsdlUne fois que vous commande que le problème, il va créer quatre fichiers pour vous:
- WeatherService.m
- WeatherService.h
- WSGeneratedObj.m
- WSGeneratedObj.h
Non, allez-y et ajoutez ces quatre fichiers à tout projet Xcode où vous voulez accéder au service Web. Si vous jouez à la maison le long, je viens de créer une Fondation d'outils Xcode projet et a ajouté les quatre fichiers. Nous avons besoin d'importer le WeatherService.h fichier où nous avons l'intention de l'utiliser, comme ceci:
#import "WeatherService.h"Pour utiliser ce service, nous avons besoin de savoir quelles fonctions ce service web expose à nous. Alors, comment do nous savons quelles sont les méthodes que nous pouvons appeler? Eh bien, vous pouvez regarder le fichier WSDL ou la documentation qui va avec le service web si ceux-ci sont disponibles. Si non, vous pouvez simplement ouvrir WeatherService.h et faites défiler vers le bas. Le dernier @interface déclaration dans le fichier - ndfdXMLService - C'est la classe, nous allons travailler avec. Vous remarquerez qu'il a plusieurs méthodes de la classe que vous (bien sûr) retenir sont les méthodes qui commencent par a + plutôt que d'un -. Ces méthodes de classe correspondent aux fonctions exposées dans le service web. Reprenons une à essayer, allons-nous? Que diriez-vous:
+ (id) LatLonListZipCode:(CFTypeRef /* Complex type http://www.weather.gov/forecasts/xml/DWMLgen/schema/DWML.xsd|zipCodeListType */) in_zipCodeList;C'est la plus simple dans le service web, de sorte que le rend bon pour montrer les rudiments de l'accès à un service Web. Maintenant, chaque fois que possible, WSMakeStubs utilise les types de données connues au moment de construire les appels de méthode. Parfois, cependant, vous allez voir paramètre spécifié que CFTypeRef, Qui est similaire à id en ce sens qu'il s'agit d'un pointeur générique dont le type n'est pas spécifié. Cela signifie soit que ce paramètre est plus complexe qu'un simple datatype peut détenir ou que les WSMakeStubs a été incapable de déterminer le type de données ou un objet serait le mieux pour la tenue de ce paramètre. Depuis qu'il sait qu'il ne sait pas tout, WSMakeStubs comprend un commentaire avec un lien vers le fichier XSD où le paramètre est défini pour vous aider.
Le problème, c'est qu'il n'est pas évident, ni bien documenté comment utiliser des méthodes de service Web qui prennent CFTypeRef paramètres. Il est assez facile de comprendre comment passer d'un type de données brutes, mais pas si facile sinon.
Maintenant, contrairement à ce cas particulier, un nombre de grands services Web ne prendra que des paramètres simples et sera relativement facile à utiliser. Voici un exemple de comment l'on pourrait appeler une telle fonction de service Web:
id result = [myWebService callMethodThatTakesInt:1];La valeur de result sera soit une NSString ou un NSData Ainsi selon le service Web. Normalement, le résultat contiendra des données XML avec la réponse des services web à votre appel.
Mais que faisons-nous dans ce cas puisque nous avons un type complexe? Eh bien, malheureusement, nous avons à lire la documentation et fouiller les talons et d'expérimenter un peu. Dans de nombreux cas, des objets complexes s'attendre à une NSDictionary avec le nom de balise XML utilisé comme clé et le contenu de la balise que l'objet correspondant. Pour les types complexes où il ya des balises imbriquées, certains des objets dans le NSDictionary vous créez peuvent être eux-mêmes NSDictionary instances. Pour cette raison, la construction de votre objecs paramètre peut devenir assez complexe dans certains cas.
Heureusement pour nous, il s'avère que cette fonction de service Web prend juste une seule chaîne contenant une liste séparée par des espaces de codes postaux. Eh bien, nous pouvons le faire. Heck, nous pouvons faire cela en une seule ligne de code:
id result = [ndfdXMLService LatLonListZipCode:@"13413 94588 12901"];Notez que nous utilisons NSString, Et non des chaînes c ici. Vous pouvez également utiliser CFString parce qu'ils sont sans frais comblé to NSString mais puisque nous sommes en Cocoa, restons avec Cocoa, allons-nous?
Après l'exécution de ce code, result sera une chaîne qui contient le XML avec des balises représentant la longitude et la latitude pour chacun des codes postaux passé po Blogger ne me laisse pas coller cette XML - elle garde la pensée de l'XML est HTML et si je change les étiquettes à utiliser> et < it helpfully converts those back to angle brackets. *sigh* Well, the price is right. Anyway, you can see the XML here si vous voulez.
Maintenant, nous avons la réponse du serveur au format XML ... si seulement nous avions un moyen facile d'analyser du XML dans le cacao et Cocoa Touch. Oh, attendez ... Je, euh ... vous a promis quelque chose de vaguement semblable à celui d'hier, n'ai-je pas? :)
Prochain: Le wrapper libxml et une petite application pratique de l'.
Aucun commentaire:
Enregistrer un commentaire