Transmettre un ficher xml à  un webservice

syncsync Membre
03:34 modifié dans API AppKit #1
Bonjour,

Je suis à  la recherche d'une solution pour questionner un webservice .net d'exemple en construisant un fichier xml et en l'envoyant à  travers un POST.

J'ai un début de solution mais pour la suite je sèche.

- (void)transmitXMLRequest:(NSData *)data<br />{<br />  NSMutableData *responseData;<br />  NSURL *webServiceURL = [NSURL URLWithString:@&quot;http://www.webservicex.net/barcode.asmx&quot;];<br />  NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:webServiceURL];<br />  [urlRequest setHTTPMethod:@&quot;POST&quot;];<br />  [urlRequest setValue:@&quot;text/xml&quot; forHTTPHeaderField:@&quot;Content-type&quot;];<br />  [urlRequest setValue:@&quot;http://www.webserviceX.net/Code39&quot; forHTTPHeaderField:@&quot;SOAPAction&quot;];<br /><br />  [urlRequest setHTTPBody:data];<br />  <br />  NSURLConnection *connectionResponse = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];<br />  if (!connectionResponse) {<br />    NSLog(@&quot;Failed to submit request&quot;);<br />  } else {<br />    NSLog(@&quot;Request submitted&quot;);<br />	responseData = [[NSMutableData alloc] init];<br />  }<br />}


Voilà  à  quoi doit ressembler la requête:

POST /barcode.asmx HTTP/1.1<br />Host: www.webservicex.net<br />Content-Type: text/xml; charset=utf-8<br />Content-Length: length<br />SOAPAction: &quot;http://www.webserviceX.NET/Code39&quot;<br /><br />&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;<br />&lt;soap:Envelope xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot; xmlns:soap=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot;&gt;<br />  &lt;soap:Body&gt;<br />    &lt;Code39 xmlns=&quot;http://www.webserviceX.NET&quot;&gt;<br />      &lt;Code&gt;string&lt;/Code&gt;<br />      &lt;BarSize&gt;int&lt;/BarSize&gt;<br />      &lt;ShowCodeString&gt;boolean&lt;/ShowCodeString&gt;<br />      &lt;Title&gt;string&lt;/Title&gt;<br />    &lt;/Code39&gt;<br />  &lt;/soap:Body&gt;<br />&lt;/soap:Envelope&gt;


et voici la réponse que je dois obtenir de ce webservice:

HTTP/1.1 200 OK<br />Content-Type: text/xml; charset=utf-8<br />Content-Length: length<br /><br />&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;<br />&lt;soap:Envelope xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot; xmlns:soap=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot;&gt;<br />  &lt;soap:Body&gt;<br />    &lt;Code39Response xmlns=&quot;http://www.webserviceX.NET&quot;&gt;<br />      &lt;Code39Result&gt;base64Binary&lt;/Code39Result&gt;<br />    &lt;/Code39Response&gt;<br />  &lt;/soap:Body&gt;<br />&lt;/soap:Envelope&gt;


Si quelqu'un pourrait me dépanner ce serait bien aimable de sa part... :brule:

Bonne soirée
Anthony

Réponses

  • syncsync Membre
    septembre 2006 modifié #2
    Pour donner suite à  cette petite expérimentation voici la mise à  jour de mon problème...

    J'arrive désormais à  envoyer ce fichier xml au server .net qui reconnait le fichier et qui me renvoie une résponse "juste".

    Voici le code que j'utilise pour obtenir le résultat désiré:

    Méthode qui construit le fichier xml à  transmettre:

    - (NSData *)constructXMLRequest<br />{<br />  NSXMLElement *root = [[NSXMLElement alloc] initWithName:@&quot;soap:Envelope&quot;];<br />  [root addAttribute:[NSXMLNode attributeWithName:@&quot;xmlns:xsi&quot; stringValue:@&quot;http://www.w3.org/2001/XMLSchema-instance&quot;]];<br />  [root addAttribute:[NSXMLNode attributeWithName:@&quot;xmlns:xsd&quot; stringValue:@&quot;http://www.w3.org/2001/XMLSchema&quot;]];<br />  [root addAttribute:[NSXMLNode attributeWithName:@&quot;xmlns:soap&quot; stringValue:@&quot;http://schemas.xmlsoap.org/soap/envelope/&quot;]];<br />  <br />  NSXMLElement *soapBody = [[NSXMLElement alloc] initWithName:@&quot;soap:Body&quot;];<br />  [root addChild:soapBody];<br />  [soapBody release];<br />  <br />  NSXMLElement *getweather = [[NSXMLElement alloc] initWithName:@&quot;GetWeather&quot;];<br />  [getweather addAttribute:[NSXMLNode attributeWithName:@&quot;xmlns&quot; stringValue:@&quot;http://www.webserviceX.NET&quot;]];<br />  //[code39 setStringValue:@&quot;code39&quot;];<br />  [soapBody addChild:getweather];<br />  [getweather release];<br />  <br />  NSXMLElement *cityname = [[NSXMLElement alloc] initWithName:@&quot;CityName&quot;];<br />  [cityname setStringValue:@&quot;Sion&quot;];<br />  [getweather addChild:cityname];<br />  [cityname release];<br />  <br />  NSXMLElement *countryname = [[NSXMLElement alloc] initWithName:@&quot;CountryName&quot;];<br />  [countryname setStringValue:@&quot;Switzerland&quot;];<br />  [getweather addChild:countryname];<br />  [countryname release];<br />  <br />//  NSXMLElement *showcodestring = [[NSXMLElement alloc] initWithName:@&quot;ShowCodeString&quot;];<br />//  [showcodestring setStringValue:@&quot;true&quot;];<br />//  [code39 addChild:showcodestring];<br />//  [showcodestring release];<br />//  <br />//  NSXMLElement *title = [[NSXMLElement alloc] initWithName:@&quot;Title&quot;];<br />//  [title setStringValue:@&quot;&quot;];<br />//  [code39 addChild:title];<br />//  [title release];<br />  <br />  NSXMLDocument *xmlRequest = [NSXMLDocument documentWithRootElement:root];<br />  [xmlRequest setVersion:@&quot;1.0&quot;];<br />  [xmlRequest setCharacterEncoding:@&quot;UTF-8&quot;];<br />  [root release];<br />  NSLog(@&quot;XML Document&#092;n%@&quot;, xmlRequest);<br />  return [xmlRequest XMLData];<br />}
    


    Méthode de transmission du fichier xml au serveur .net

    - (IBAction)transmitXMLRequest:(id)sender<br />{<br />  NSData *data = [self constructXMLRequest];<br />  <br />  NSMutableData *responseData;<br />  NSURL *webServiceURL = [NSURL URLWithString:@&quot;http://www.webservicex.net/globalweather.asmx&quot;];<br />  NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:webServiceURL];<br />  [urlRequest setHTTPMethod:@&quot;POST&quot;];<br />  [urlRequest setValue:@&quot;text/xml; charset=utf-8&quot; forHTTPHeaderField:@&quot;Content-type&quot;];<br />  [urlRequest setValue:@&quot;&#092;&quot;http://www.webserviceX.NET/GetWeather&#092;&quot;&quot; forHTTPHeaderField:@&quot;SOAPAction&quot;];<br /><br />  [urlRequest setHTTPBody:data];<br />  <br />  NSURLConnection *connectionResponse = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];<br />  if (!connectionResponse) {<br />    NSLog(@&quot;Failed to submit request&quot;);<br />  } else {<br />    NSLog(@&quot;Request submitted&quot;);<br />	responseData = [[NSMutableData alloc] init];<br />	NSLog(@&quot;response&quot;, responseData);<br />  }<br />}<br />
    


    Voici un tcpdump de la réponse du service .net:

    HTTP/1.1 200 OK<br />Date: Fri, 08 Sep 2006 11:03:41 GMT<br />Server: Microsoft-IIS/6.0<br />X-Powered-By: ASP.NET<br />X-AspNet-Version: 1.1.4322<br />Cache-Control: private, max-age=0<br />Content-Type: text/xml; charset=utf-8<br />Content-Length: 1095<br /><br />&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;&lt;soap:Envelope xmlns:soap=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;&gt;&lt;soap:Body&gt;&lt;GetWeatherResponse xmlns=&quot;http://www.webserviceX.NET&quot;&gt;&lt;GetWeatherResult&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&amp;gt;<br />&amp;lt;CurrentWeather&amp;gt;<br />  &amp;lt;Location&amp;gt;Sion, Switzerland (LSGS) 46-13N 007-20E 481M&amp;lt;/Location&amp;gt;<br />  &amp;lt;Time&amp;gt;Aug 09, 2006 - 05:20 AM EDT / 2006.08.09 0920 UTC&amp;lt;/Time&amp;gt;<br />  &amp;lt;Wind&amp;gt; from the WSW (250 degrees) at 5 MPH (4 KT) (direction variable):0&amp;lt;/Wind&amp;gt;<br />  &amp;lt;Visibility&amp;gt; greater than 7 mile(s):0&amp;lt;/Visibility&amp;gt;<br />  &amp;lt;SkyConditions&amp;gt; mostly clear&amp;lt;/SkyConditions&amp;gt;<br />  &amp;lt;Temperature&amp;gt; 68 F (20 C)&amp;lt;/Temperature&amp;gt;<br />  &amp;lt;DewPoint&amp;gt; 53 F (12 C)&amp;lt;/DewPoint&amp;gt;<br />  &amp;lt;RelativeHumidity&amp;gt; 59%&amp;lt;/RelativeHumidity&amp;gt;<br />  &amp;lt;Pressure&amp;gt; 29.91 in. Hg (1013 hPa)&amp;lt;/Pressure&amp;gt;<br />  &amp;lt;Status&amp;gt;Success&amp;lt;/Status&amp;gt;<br />&amp;lt;/CurrentWeather&amp;gt;&lt;/GetWeatherResult&gt;&lt;/GetWeatherResponse&gt;&lt;/soap:Body&gt;&lt;/soap:Envelope&gt;<br />
    


    Ok à  l'aide de ce tutoriel

    http://www.awprofessional.com/articles/printerfriendly.asp?p=468381&rl=1

    Maintenant ce qu'il me manque parser le fichier xml reçu.

    J'ai quelque problème d'encodage apparemment...

    &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;<br />&lt;soap:Envelope xmlns:soap=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;&gt;<br />&lt;soap:Body&gt;<br />&lt;GetWeatherResponse xmlns=&quot;http://www.webserviceX.NET&quot;&gt;<br />&lt;GetWeatherResult&gt;<br />&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt; <br />&amp;lt;CurrentWeather&gt; <br />&amp;lt;Location&gt;Sion, Switzerland (LSGS) 46-13N 007-20E 481M&amp;lt;/Location&gt; &amp;lt;Time&gt;Aug 09, 2006 - 05:20 AM EDT / 2006.08.09 0920 UTC&amp;lt;/Time&gt; <br />&amp;lt;Wind&gt; from the WSW (250 degrees) at 5 MPH (4 KT) (direction variable):0&amp;lt;/Wind&gt; <br />&amp;lt;Visibility&gt; greater than 7 mile(s):0&amp;lt;/Visibility&gt; <br />&amp;lt;SkyConditions&gt; mostly clear&amp;lt;/SkyConditions&gt; <br />&amp;lt;Temperature&gt; 68 F (20 C)&amp;lt;/Temperature&gt; <br />&amp;lt;DewPoint&gt; 53 F (12 C)&amp;lt;/DewPoint&gt; <br />&amp;lt;RelativeHumidity&gt; 59%&amp;lt;/RelativeHumidity&gt; <br />&amp;lt;Pressure&gt; 29.91 in. Hg (1013 hPa)&amp;lt;/Pressure&gt; <br />&amp;lt;Status&gt;Success&amp;lt;/Status&gt; <br />&amp;lt;/CurrentWeather&gt;<br />&lt;/GetWeatherResult&gt;<br />&lt;/GetWeatherResponse&gt;<br />&lt;/soap:Body&gt;<br />&lt;/soap:Envelope&gt;
    


    Une petite aide pour retrouver mes beaux "<" en lieux et place de ces caractères provenant de l'html "&lt" ???????


    PS: J'ai changé de webservice mais toujours hosté chez webserviceX.net
  • syncsync Membre
    03:34 modifié #3
    En faisant cela j'arrive à  analyser un bout mon fichier xml mais après je sèche

     
    NSXMLElement *rootElement, *tmpElement;<br />&nbsp; <br />&nbsp; rootElement = [responseXML rootElement];<br />&nbsp; <br />&nbsp; tmpElement = [[rootElement elementsForName:@&quot;soap:Body&quot;] lastObject];<br />&nbsp; <br />&nbsp; tmpElement = [[tmpElement elementsForName:@&quot;GetWeatherResponse&quot;] lastObject];<br />&nbsp; <br />&nbsp; tmpElement = [[tmpElement elementsForName:@&quot;GetWeatherResult&quot;] lastObject];
    


    J'arrive jusqu'à  là  après je sèche!!!

    &amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt; <br />&amp;lt;CurrentWeather&gt; <br />&amp;lt;Location&gt;Sion, Switzerland (LSGS) 46-13N 007-20E 481M&amp;lt;/Location&gt; &amp;lt;Time&gt;Aug 09, 2006 - 05:20 AM EDT / 2006.08.09 0920 UTC&amp;lt;/Time&gt; <br />&amp;lt;Wind&gt; from the WSW (250 degrees) at 5 MPH (4 KT) (direction variable):0&amp;lt;/Wind&gt; <br />&amp;lt;Visibility&gt; greater than 7 mile(s):0&amp;lt;/Visibility&gt; <br />&amp;lt;SkyConditions&gt; mostly clear&amp;lt;/SkyConditions&gt; <br />&amp;lt;Temperature&gt; 68 F (20 C)&amp;lt;/Temperature&gt; <br />&amp;lt;DewPoint&gt; 53 F (12 C)&amp;lt;/DewPoint&gt; <br />&amp;lt;RelativeHumidity&gt; 59%&amp;lt;/RelativeHumidity&gt; <br />&amp;lt;Pressure&gt; 29.91 in. Hg (1013 hPa)&amp;lt;/Pressure&gt; <br />&amp;lt;Status&gt;Success&amp;lt;/Status&gt; <br />&amp;lt;/CurrentWeather&gt;
    
  • laurrislaurris Membre
    03:34 modifié #4
    J'ai pas bien compris ce que tu veux dire par "parser" le xml. Si tu veux obtenir la valeur d'un noeud particulier qui se trouve dans les profondeurs de l'arbre xml, je pense que le mieux est d'utiliser le language XPath. En faisant
    - (NSArray *)nodesForXPath:(NSString *)xpath error:(NSError **)error
    


    Si tu veux plus d'infos sur l'utilisation de Xpath, je peux t'aider. Si j'ai rien compris à  ta question ... je peux pas t'aider (enfin si, je peux si je comprends).
  • syncsync Membre
    03:34 modifié #5
    Xml bien formé à  l'aide de cette classe

    http://weblog.scifihifi.com/2004/06/10/unescaping-xml-entities-in-nsstrings/

    Il ne reste plus qu'à  parser le fichier xml qui est le suivant:

    &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />&lt;soap:Envelope xmlns:soap=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;&gt;<br />&lt;soap:Body&gt;<br />&lt;GetWeatherResponse xmlns=&quot;http://www.webserviceX.NET&quot;&gt;<br />&lt;GetWeatherResult&gt;<br />&lt;CurrentWeather&gt;<br />&lt;Location&gt;Sion, Switzerland (LSGS) 46-13N 007-20E 481M&lt;/Location&gt;<br />&lt;Time&gt;Aug 09, 2006 - 05:20 AM EDT / 2006.08.09 0920 UTC&lt;/Time&gt;<br />&lt;Wind&gt;from the WSW (250 degrees) at 5 MPH (4 KT) (direction variable):0&lt;/Wind&gt;<br />&lt;Visibility&gt;greater than 7 mile(s):0&lt;/Visibility&gt;<br />&lt;SkyConditions&gt;mostly clear&lt;/SkyConditions&gt;<br />&lt;Temperature&gt;68 F (20 C)&lt;/Temperature&gt;<br />&lt;DewPoint&gt;53 F (12 C)&lt;/DewPoint&gt;<br />&lt;RelativeHumidity&gt;59%&lt;/RelativeHumidity&gt;<br />&lt;Pressure&gt;29.91 in. Hg (1013 hPa)&lt;/Pressure&gt;<br />&lt;Status&gt;Success&lt;/Status&gt;<br />&lt;/CurrentWeather&gt;<br />&lt;/GetWeatherResult&gt;<br />&lt;/GetWeatherResponse&gt;<br />&lt;/soap:Body&gt;<br />&lt;/soap:Envelope&gt;
    


    Une petite soluce pour récupérer en NSString "<Location>Sion, Switzerland (LSGS) 46-13N 007-20E 481M</Location>" ?

    Allez bon week end  <3
  • laurrislaurris Membre
    septembre 2006 modifié #6
    Comme ça à  vue de nez, je dirais que le Xpath de ton noeud "Location" serait:

    @soap:Body/GetWeatherRespons/GetWeatherResult/CurrentWeather/Location en prenant comme NSXMLNode de départ ton rootElement.

    Pour tester un XPath, j'utilise AquaXpath (dispo sur macupdate.com), c'est assez pratique.

    Recommandation W3C de XPath 1.0: http://www.w3.org/TR/xpath
  • AliGatorAliGator Membre, Modérateur
    03:34 modifié #7
    Le problème est surtout que ton WebService a l'air :
    - soit de ne pas te répondre ce qu'il devrait, en échappant des caractères qu'il ne devrait pas échapper
    - soit encapsuler un document XML dans un autre document XML mais sans en échaper la totalité des caractères (&lt; mais pas de &gt;, c'est pas cohérent)

    Donc pour moi c'est le webservice qui s'amuse avec tes pieds...
  • syncsync Membre
    03:34 modifié #8
    dans 1157731080:

    Comme ça à  vue de nez, je dirais que le Xpath de ton noeud "Location" serait:

    @soap:Body/GetWeatherRespons/GetWeatherResult/CurrentWeather/Location en prenant comme NSXMLNode de départ ton rootElement.

    Pour tester un XPath, j'utilise AquaXpath (dispo sur macupdate.com), c'est assez pratique.

    Recommandation W3C de XPath 1.0: http://www.w3.org/TR/xpath


    Merci pour ta réponse mais je ne sais pas comment utiliser xpath dans un fichier xml:

    Ce que je fais:

    NSXMLElement *rootElement, *tempLocation;<br />&nbsp; rootElement = [responseXMLNew rootElement];
    


    Mais maintenant si je veux attribuer la location à  tempLocation je fais comment ?

    Bonne journée

  • laurrislaurris Membre
    03:34 modifié #9
    dans 1157961215:


    Merci pour ta réponse mais je ne sais pas comment utiliser xpath dans un fichier xml:



    Rassure toi, ça devrait pas être trop dur. Il suffit que tu lises ma première réponse dans ce fil et hop! tu as la méthode appropriée pour trouver un noeud xml avec XPath.

     
    dans 1157961215:
    Mais maintenant si je veux attribuer la location à  tempLocation je fais comment ?

    Bonne journée 


    Oulala ça se complique. Est-ce que tu veux vraiment "attribuer" une valeur à  un noeud de tempLocation ou récupérer la valeur d'un noeud ? Cé pas pareil ! Dans le premier cas, la méthode que je t'ai signalée suffit. Dans le deuxième, c'est (un peu) plus compliqué.
  • syncsync Membre
    03:34 modifié #10
    Comme un lundi matin suis complètement hors sujet... effectivement je ne veux pas attribuer mais putôt lire la valeur...

    Et aussi plus au il y a la réponse à  ma question...

    héhé

    Je vais aller me réveiller !!

    Bonne journée et désolé  :-\\
  • syncsync Membre
    03:34 modifié #11
    Bonjour,

    Suite du feuilleton des services web... tout fonctionne je butte au niveau du parsing xml

    Je voudrais récupérer les valeurs longitude et latitude du fichier xml suivant:

    &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />&lt;soapenv:Envelope xmlns:soapenv=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&gt;<br />	&lt;soapenv:Body&gt;<br />		&lt;ns1:getLocationsListResponse xmlns:ns1=&quot;http://service.localization.ws.viamichelin.com&quot; soapenv:encodingStyle=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot;&gt;<br />			&lt;getLocationsListReturn xmlns:ns2=&quot;http://localization.ws.viamichelin.com&quot; xmlns:soapenc=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xsi:type=&quot;soapenc:Array&quot; soapenc:arrayType=&quot;ns2:FindLocations[1]&quot;&gt;<br />				&lt;item href=&quot;#id0&quot;/&gt;<br />			&lt;/getLocationsListReturn&gt;<br />		&lt;/ns1:getLocationsListResponse&gt;<br />		&lt;multiRef xmlns:soapenc=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xmlns:ns3=&quot;http://localization.ws.viamichelin.com&quot; id=&quot;id0&quot; soapenc:root=&quot;0&quot; soapenv:encodingStyle=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xsi:type=&quot;ns3:FindLocations&quot;&gt;<br />			&lt;errorCode xsi:type=&quot;xsd:int&quot;&gt;0&lt;/errorCode&gt;<br />			&lt;results xsi:type=&quot;soapenc:Array&quot; soapenc:arrayType=&quot;ns3:FindLocation[1]&quot;&gt;<br />				&lt;item href=&quot;#id1&quot;/&gt;<br />			&lt;/results&gt;<br />			&lt;size xsi:type=&quot;xsd:int&quot;&gt;1&lt;/size&gt;<br />			&lt;topScore xsi:type=&quot;xsd:double&quot;&gt;0.0&lt;/topScore&gt;<br />		&lt;/multiRef&gt;<br />		&lt;multiRef xmlns:ns4=&quot;http://localization.ws.viamichelin.com&quot; xmlns:soapenc=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; id=&quot;id1&quot; soapenc:root=&quot;0&quot; soapenv:encodingStyle=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xsi:type=&quot;ns4:FindLocation&quot;&gt;<br />			&lt;addressIncoherenceDegree xsi:type=&quot;xsd:int&quot;&gt;0&lt;/addressIncoherenceDegree&gt;<br />			&lt;cityIncoherenceDegree xsi:type=&quot;xsd:int&quot;&gt;0&lt;/cityIncoherenceDegree&gt;<br />			&lt;foundLocation href=&quot;#id2&quot;/&gt;<br />			&lt;score xsi:type=&quot;xsd:double&quot;&gt;0.0&lt;/score&gt;<br />		&lt;/multiRef&gt;<br />		&lt;multiRef xmlns:ns5=&quot;http://localization.ws.viamichelin.com&quot; xmlns:soapenc=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; id=&quot;id2&quot; soapenc:root=&quot;0&quot; soapenv:encodingStyle=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xsi:type=&quot;ns5:Location&quot;&gt;<br />			&lt;address href=&quot;#id3&quot;/&gt;<br />			&lt;geoCoordinates href=&quot;#id4&quot;/&gt;<br />			&lt;id xsi:type=&quot;xsd:string&quot;&gt;141151odga004taev105402h3&lt;/id&gt;<br />			&lt;poi xsi:type=&quot;ns5:Poi&quot; xsi:nil=&quot;true&quot;/&gt;<br />			&lt;type xsi:type=&quot;xsd:int&quot;&gt;3&lt;/type&gt;<br />		&lt;/multiRef&gt;<br />		&lt;multiRef xmlns:ns6=&quot;http://localization.ws.viamichelin.com&quot; xmlns:soapenc=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; id=&quot;id3&quot; soapenc:root=&quot;0&quot; soapenv:encodingStyle=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xsi:type=&quot;ns6:Address&quot;&gt;<br />			&lt;cityLabel xsi:type=&quot;xsd:string&quot;&gt;Chermignon&lt;/cityLabel&gt;<br />			&lt;countryCode xsi:type=&quot;xsd:string&quot;&gt;CHE&lt;/countryCode&gt;<br />			&lt;countryLabel xsi:type=&quot;xsd:string&quot;&gt;Schweiz&lt;/countryLabel&gt;<br />			&lt;districtLabel xsi:type=&quot;xsd:string&quot;&gt;Les Briesses&lt;/districtLabel&gt;<br />			&lt;formattedAddressLine xsi:type=&quot;xsd:string&quot;&gt;Route De Chorécrans&lt;/formattedAddressLine&gt;<br />			&lt;formattedCityAddressLine xsi:type=&quot;xsd:string&quot;&gt;Chermignon&lt;/formattedCityAddressLine&gt;<br />			&lt;gatheringLabel xsi:type=&quot;xsd:string&quot; xsi:nil=&quot;true&quot;/&gt;<br />			&lt;officialCountryCode xsi:type=&quot;xsd:string&quot;&gt;CH&lt;/officialCountryCode&gt;<br />			&lt;stateLabel xsi:type=&quot;xsd:string&quot;&gt;Wallis&lt;/stateLabel&gt;<br />			&lt;streetLabel xsi:type=&quot;xsd:string&quot;&gt;Route De Chorécrans&lt;/streetLabel&gt;<br />			&lt;streetNumber xsi:type=&quot;xsd:string&quot;/&gt;<br />			&lt;zipCode xsi:type=&quot;xsd:string&quot; xsi:nil=&quot;true&quot;/&gt;<br />		&lt;/multiRef&gt;<br />		&lt;multiRef xmlns:ns7=&quot;http://geo.ws.viamichelin.com&quot; xmlns:soapenc=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; id=&quot;id4&quot; soapenc:root=&quot;0&quot; soapenv:encodingStyle=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xsi:type=&quot;ns7:GeoCoordinates&quot;&gt;<br />			&lt;latitude xsi:type=&quot;xsd:double&quot;&gt;46.29507&lt;/latitude&gt;<br />			&lt;longitude xsi:type=&quot;xsd:double&quot;&gt;7.47669&lt;/longitude&gt;<br />		&lt;/multiRef&gt;<br />	&lt;/soapenv:Body&gt;<br />&lt;/soapenv:Envelope&gt;
    


    Mais le problème c'est que latitude et longitude ne sont pas toujours au même endroit !

    Des fois il se trouve à  un autre endroit dans le réponse du serveur:

    &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />&lt;soapenv:Envelope xmlns:soapenv=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&gt;<br />	&lt;soapenv:Body&gt;<br />		&lt;ns1:getLocationsListResponse xmlns:ns1=&quot;http://service.localization.ws.viamichelin.com&quot; soapenv:encodingStyle=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot;&gt;<br />			&lt;getLocationsListReturn xmlns:ns2=&quot;http://localization.ws.viamichelin.com&quot; xmlns:soapenc=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xsi:type=&quot;soapenc:Array&quot; soapenc:arrayType=&quot;ns2:FindLocations[1]&quot;&gt;<br />				&lt;item href=&quot;#id0&quot;/&gt;<br />			&lt;/getLocationsListReturn&gt;<br />		&lt;/ns1:getLocationsListResponse&gt;<br />		&lt;multiRef xmlns:soapenc=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xmlns:ns3=&quot;http://localization.ws.viamichelin.com&quot; id=&quot;id0&quot; soapenc:root=&quot;0&quot; soapenv:encodingStyle=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xsi:type=&quot;ns3:FindLocations&quot;&gt;<br />			&lt;errorCode xsi:type=&quot;xsd:int&quot;&gt;0&lt;/errorCode&gt;<br />			&lt;results xsi:type=&quot;soapenc:Array&quot; soapenc:arrayType=&quot;ns3:FindLocation[1]&quot;&gt;<br />				&lt;item href=&quot;#id1&quot;/&gt;<br />			&lt;/results&gt;<br />			&lt;size xsi:type=&quot;xsd:int&quot;&gt;1&lt;/size&gt;<br />			&lt;topScore xsi:type=&quot;xsd:double&quot;&gt;0.0&lt;/topScore&gt;<br />		&lt;/multiRef&gt;<br />		&lt;multiRef xmlns:ns4=&quot;http://localization.ws.viamichelin.com&quot; xmlns:soapenc=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; id=&quot;id1&quot; soapenc:root=&quot;0&quot; soapenv:encodingStyle=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xsi:type=&quot;ns4:FindLocation&quot;&gt;<br />			&lt;addressIncoherenceDegree xsi:type=&quot;xsd:int&quot;&gt;0&lt;/addressIncoherenceDegree&gt;<br />			&lt;cityIncoherenceDegree xsi:type=&quot;xsd:int&quot;&gt;0&lt;/cityIncoherenceDegree&gt;<br />			&lt;foundLocation href=&quot;#id2&quot;/&gt;<br />			&lt;score xsi:type=&quot;xsd:double&quot;&gt;0.0&lt;/score&gt;<br />		&lt;/multiRef&gt;<br />		&lt;multiRef xmlns:ns5=&quot;http://localization.ws.viamichelin.com&quot; xmlns:soapenc=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; id=&quot;id2&quot; soapenc:root=&quot;0&quot; soapenv:encodingStyle=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xsi:type=&quot;ns5:Location&quot;&gt;<br />			&lt;address href=&quot;#id3&quot;/&gt;<br />			&lt;geoCoordinates href=&quot;#id4&quot;/&gt;<br />			&lt;id xsi:type=&quot;xsd:string&quot;&gt;141151odga004taev105402h3&lt;/id&gt;<br />			&lt;poi xsi:type=&quot;ns5:Poi&quot; xsi:nil=&quot;true&quot;/&gt;<br />			&lt;type xsi:type=&quot;xsd:int&quot;&gt;3&lt;/type&gt;<br />		&lt;/multiRef&gt;<br />		&lt;multiRef xmlns:ns6=&quot;http://geo.ws.viamichelin.com&quot; xmlns:soapenc=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; id=&quot;id4&quot; soapenc:root=&quot;0&quot; soapenv:encodingStyle=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xsi:type=&quot;ns6:GeoCoordinates&quot;&gt;<br />			&lt;latitude xsi:type=&quot;xsd:double&quot;&gt;46.29507&lt;/latitude&gt;<br />			&lt;longitude xsi:type=&quot;xsd:double&quot;&gt;7.47669&lt;/longitude&gt;<br />		&lt;/multiRef&gt;<br />		&lt;multiRef xmlns:ns7=&quot;http://localization.ws.viamichelin.com&quot; xmlns:soapenc=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; id=&quot;id3&quot; soapenc:root=&quot;0&quot; soapenv:encodingStyle=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xsi:type=&quot;ns7:Address&quot;&gt;<br />			&lt;cityLabel xsi:type=&quot;xsd:string&quot;&gt;Chermignon&lt;/cityLabel&gt;<br />			&lt;countryCode xsi:type=&quot;xsd:string&quot;&gt;CHE&lt;/countryCode&gt;<br />			&lt;countryLabel xsi:type=&quot;xsd:string&quot;&gt;Schweiz&lt;/countryLabel&gt;<br />			&lt;districtLabel xsi:type=&quot;xsd:string&quot;&gt;Les Briesses&lt;/districtLabel&gt;<br />			&lt;formattedAddressLine xsi:type=&quot;xsd:string&quot;&gt;Route De Chorécrans&lt;/formattedAddressLine&gt;<br />			&lt;formattedCityAddressLine xsi:type=&quot;xsd:string&quot;&gt;Chermignon&lt;/formattedCityAddressLine&gt;<br />			&lt;gatheringLabel xsi:type=&quot;xsd:string&quot; xsi:nil=&quot;true&quot;/&gt;<br />			&lt;officialCountryCode xsi:type=&quot;xsd:string&quot;&gt;CH&lt;/officialCountryCode&gt;<br />			&lt;stateLabel xsi:type=&quot;xsd:string&quot;&gt;Wallis&lt;/stateLabel&gt;<br />			&lt;streetLabel xsi:type=&quot;xsd:string&quot;&gt;Route De Chorécrans&lt;/streetLabel&gt;<br />			&lt;streetNumber xsi:type=&quot;xsd:string&quot;/&gt;<br />			&lt;zipCode xsi:type=&quot;xsd:string&quot; xsi:nil=&quot;true&quot;/&gt;<br />		&lt;/multiRef&gt;<br />	&lt;/soapenv:Body&gt;
    


    Par contre multiRef à  toujours un id de 4...

    Quelqu'un connaà®trait-il un solution miracle ???
  • syncsync Membre
    03:34 modifié #12
    Je crois que c'est bon j'ai utilisé Xpath

    NSArray *arrayLatitude = [rootElement nodesForXPath:@&quot;soapenv:Body/multiRef[@id=&#092;&quot;id4&#092;&quot;]&quot; error:nil];
    


    Bonne journée
  • syncsync Membre
    03:34 modifié #13
    Bonjour,

    Aujourd'hui un nouveau problème... héhé pour changer

    Je fais appel à  3 webservices à  la suite.... qui sont complémentaires, le problème c'est que je n'arrrive pas à  savoir quand un appel à  un webservice est terminé...

    chaque webservices est appelé de cette façon:

    NSURLConnection *connectionResponse = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];<br />
    


    Enfin on peut savoir quand le chargement de la connexion est terminée grâce à  cette méthode déléguée

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection
    


    Pour l'instant ce que je fais c'est que j'appel mon 2ème webservice dans la méthode déléguée connectionDidFinishLoading mais ce n'est pas satisfaisant.

    Donc il faudrait trouver une façon pour ne pas lancer le 2ème webservice tant que l'on a pas fini le chargement du 1er webservice et ainsi de suite à  l'aide d'une méthode...

    Quelqu'un pourrait-il m'aider ???

    Salutations
    Anthony
  • syncsync Membre
    03:34 modifié #14
    Plus clairement j'ai ce bout de code qui me pose problème

    + (id)GenerateMap:(NSString*)WSSLatitude longitude:(NSString *)WSSLongitude pixelSize:(NSString *)WSSPixelSize<br />{<br />&nbsp; &nbsp; id result = NULL;&nbsp; &nbsp; <br />&nbsp; &nbsp; CallViaMichelinGenerateMap* _invocation = [[CallViaMichelinGenerateMap alloc] init];&nbsp; &nbsp; <br />&nbsp; &nbsp; NSData *data = [_invocation constructXMLRequest:WSSLatitude longitude:WSSLongitude pixelSize:WSSPixelSize];&nbsp; &nbsp; <br />	[_invocation transmitXMLRequest:data];<br />	result = [[_invocation getValues] retain];&nbsp; &nbsp; <br />&nbsp; &nbsp; [_invocation release];&nbsp; &nbsp; <br />&nbsp; &nbsp; return result;&nbsp; &nbsp; <br />}
    


    En particulier cette partie j'aimerai que

    result = [[_invocation getValues] retain];
    


    ne soit appelé que quand l'appel au webservice est terminé sinon il va me renvoyer des valeures nulles car la méthode getValues va récupérer le dictionnaire de résultat de mon appel au webservice

    Sais pas si c'est un peu plus clair  :o :o :o

    bonne journée
  • BruBru Membre
    03:34 modifié #15
    dans 1158136846:

    Enfin on peut savoir quand le chargement de la connexion est terminée grâce à  cette méthode déléguée
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection
    

    Pour l'instant ce que je fais c'est que j'appel mon 2ème webservice dans la méthode déléguée connectionDidFinishLoading mais ce n'est pas satisfaisant.
    Donc il faudrait trouver une façon pour ne pas lancer le 2ème webservice tant que l'on a pas fini le chargement du 1er webservice et ainsi de suite à  l'aide d'une méthode...


    Pourquoi ce n'est pas satisfaisant ?

    En utilisant sendSynchronousRequest:returningResponse:error: de NSURLConnection,
    tu évites l'utilisation du delegate, et tu es sûr qu'au retour de la méthode,
    la réponse (ou l'éventuelle erreur) est arrivée avant d'enchainer sur la 2ème connexion.

    Mais, en utilisant cette méthode, tu bloques le thread principal de ton appli tant que la connexion
    n'est pas terminée. Ceci provoque le figeage de l'interface, voire la roue-de-la-mort si le
    webservice est trop long à  répondre.

    L'utilisation d'une connexion asynchrione (tournant dans un thtread séparé) et d'un delegate est
    pour moi la solution la plus élégante, et surtout, la plus MACOSX.

    .
  • syncsync Membre
    septembre 2006 modifié #16
    dans 1158137568:

    Pourquoi ce n'est pas satisfaisant ?

    En utilisant sendSynchronousRequest:returningResponse:error: de NSURLConnection,
    tu évites l'utilisation du delegate, et tu es sûr qu'au retour de la méthode,
    la réponse (ou l'éventuelle erreur) est arrivée avant d'enchainer sur la 2ème connexion.

    Mais, en utilisant cette méthode, tu bloques le thread principal de ton appli tant que la connexion
    n'est pas terminée. Ceci provoque le figeage de l'interface, voire la roue-de-la-mort si le
    webservice est trop long à  répondre.

    L'utilisation d'une connexion asynchrione (tournant dans un thtread séparé) et d'un delegate est
    pour moi la solution la plus élégante, et surtout, la plus MACOSX.

    .


    Oui c'est clair le delegate marche très bien. Le problème c'est qu'apparemment depuis ce delegate(connectionDidFinishLoading) si j'appelle ma fonction :
    [self setPicture:url]
    
    rien ne se produit.

    (voici ma méthode setPicture)
    - (void)setPicture:(NSString *)urlString<br />{<br />	<br />	NSURL *imageURL = [NSURL URLWithString:urlString];<br />	NSData *imageData = [imageURL resourceDataUsingCache:NO];<br />	NSImage *imageFromBundle = [[NSImage alloc] initWithData:imageData];<br /><br />	if (imageFromBundle)<br />	{<br />		// The image loaded properly, so lets display it.<br />		[photoContact setImage:imageFromBundle];<br />		[imageFromBundle release];<br />	}<br />	else  //  if (!imageFromBundle)<br />	{<br />		// The image did not load properly, so lets send an error to the log.<br />		// At this time, we could either load a copy of the image from the bundle,<br />		// or simply display an error sheet.<br />		NSLog(@&quot;imageView could not be loaded.&quot;);<br />	}<br />}
    
  • BruBru Membre
    03:34 modifié #17
    Premièrement, je ne sais pas ce que veut dire "rien ne se produit".
    En effet, moi je te réponds : que doit-il se produire ?

    De toute façon, en passant par la méthode asynchrone, la connexion se fait dans un thread séparé.
    Donc, le delegate est exécuté aussi dans ce thread séparé.
    Donc [self setPicture:url] est exécuté dans le thread séparé.
    Donc, toute méthode mettant à  jour l'UI ne fonctionnera pas !
    Donc, je suppose que [photoContact setImage:imageFromBundle] met à  jour un NSImageView, mais le raffraichissement à  l'écran ne se fera pas.

    Pour solutionner ça, je te conseille d'appeler [self setPicture:url] dans le thread principal en faisant :
    [self performSelectorOnMainThread:@selector(setPicture:) withObject:url waitUntilDone:NO];
    


    .
  • syncsync Membre
    03:34 modifié #18
    dans 1158140920:

    Premièrement, je ne sais pas ce que veut dire "rien ne se produit".
    En effet, moi je te réponds : que doit-il se produire ?

    De toute façon, en passant par la méthode asynchrone, la connexion se fait dans un thread séparé.
    Donc, le delegate est exécuté aussi dans ce thread séparé.
    Donc [self setPicture:url] est exécuté dans le thread séparé.
    Donc, toute méthode mettant à  jour l'UI ne fonctionnera pas !
    Donc, je suppose que [photoContact setImage:imageFromBundle] met à  jour un NSImageView, mais le raffraichissement à  l'écran ne se fera pas.

    Pour solutionner ça, je te conseille d'appeler [self setPicture:url] dans le thread principal en faisant :
    [self performSelectorOnMainThread:@selector(setPicture:) withObject:url waitUntilDone:NO];
    


    .


    Merci pour la résponse.... effectivement le but étant de mettre à  jour une NSImageView. J'ai bien utiliser performSelectorOnMainThread mais toujours rien pas de mise à  jour de l'image il doit il y a voir un petit truc que je loupe
  • syncsync Membre
    03:34 modifié #19
    Apparemment il fallait rester dans la même classe ! Tout fonctionne à  merveille encore merci..... !!!!

    Bonne soirée

    ;D
  • syncsync Membre
    03:34 modifié #20
    Aujourd'hui petit problème avec xpath

    J'aimerai récupérer ça dans un array mais je me retrouve toujours avec un nsarray vide

    &lt;getLocationsListReturn xmlns:ns2=&quot;http://localization.ws.viamichelin.com&quot; xmlns:soapenc=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xsi:type=&quot;soapenc:Array&quot; soapenc:arrayType=&quot;ns2:FindLocations[1]&quot;&gt;<br />				&lt;item href=&quot;#id0&quot;/&gt;<br />			&lt;/getLocationsListReturn&gt;
    


    J'ai essayé les xpath suivants:

    NSArray *arraygetLocationsListReturn = [rootElement nodesForXPath:@&quot;soapenv:Body/&#092;&quot;http://service.localization.ws.viamichelin.com&#092;&quot;/:getLocationsListResponse&quot; error:nil];
    


    NSArray *arraygetLocationsListReturn = [rootElement nodesForXPath:@&quot;soapenv:Body/ns1:getLocationsListResponse&quot; error:nil];
    


    NSArray *arraygetLocationsListReturn = [rootElement nodesForXPath:@&quot;soapenv:Body/getLocationsListResponse&quot; error:nil];
    


    Voici le fichier xml...

    &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />&lt;soapenv:Envelope xmlns:soapenv=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&gt;<br />	&lt;soapenv:Body&gt;<br />		&lt;ns1:getLocationsListResponse xmlns:ns1=&quot;http://service.localization.ws.viamichelin.com&quot; soapenv:encodingStyle=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot;&gt;<br />			&lt;getLocationsListReturn xmlns:ns2=&quot;http://localization.ws.viamichelin.com&quot; xmlns:soapenc=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xsi:type=&quot;soapenc:Array&quot; soapenc:arrayType=&quot;ns2:FindLocations[1]&quot;&gt;<br />				&lt;item href=&quot;#id0&quot;/&gt;<br />			&lt;/getLocationsListReturn&gt;<br />		&lt;/ns1:getLocationsListResponse&gt;<br />	&lt;/soapenv:Body&gt;<br />&lt;/soapenv:Envelope&gt;
    
  • syncsync Membre
    septembre 2006 modifié #21
    voilà 

    NSArray *arraygetLocationsListReturn = [rootElement nodesForXPath:@&quot;//getLocationsListReturn/item&quot; error:nil];
    


    Voilà  maintenant j'obtiens cela

    arraygetLocationsListReturn: (&lt;item href=&quot;#id0&quot;&gt;&lt;/item&gt;)
    


    et je veux récupérer le #id0 comment faire ?
  • syncsync Membre
    03:34 modifié #22
    dans 1158245398:

    voilà 

    NSArray *arraygetLocationsListReturn = [rootElement nodesForXPath:@&quot;//getLocationsListReturn/item&quot; error:nil];
    


    Voilà  maintenant j'obtiens cela

    arraygetLocationsListReturn: (&lt;item href=&quot;#id0&quot;&gt;&lt;/item&gt;)
    


    et je veux récupérer le #id0 comment faire ?


    Résonse

    &nbsp; NSArray *arraygetLocationsListReturn = [rootElement nodesForXPath:@&quot;//results//@href&quot; error:nil];<br />	&nbsp; NSString *href = [[arraygetLocationsListReturn lastObject] stringValue];
    
  • syncsync Membre
    03:34 modifié #23
    dans 1158245398:

    voilà 

    NSArray *arraygetLocationsListReturn = [rootElement nodesForXPath:@&quot;//getLocationsListReturn/item&quot; error:nil];
    


    Voilà  maintenant j'obtiens cela

    arraygetLocationsListReturn: (&lt;item href=&quot;#id0&quot;&gt;&lt;/item&gt;)
    


    et je veux récupérer le #id0 comment faire ?


    Résonse

    &nbsp; NSArray *arraygetLocationsListReturn = [rootElement nodesForXPath:@&quot;//results//item/@href&quot; error:nil];<br />	&nbsp; NSString *href = [[arraygetLocationsListReturn lastObject] stringValue];
    
Connectez-vous ou Inscrivez-vous pour répondre.