Parser un flux xml

Parser un flux xml - XML/XSL - Programmation

Marsh Posté le 30-07-2006 à 19:25:25    

Bonjour,
 
J’ai un souci pour extraire les données d’un flux xml que je reçois :
Pour exemple et pour simplifier, voici un fichier de structure identique (mais allégé ici)
 
Je reçois donc ceci:
 

Code :
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  3.   <soap:Body>
  4.    <ListCarsResponse xmlns="http://blablabla.com/webservices/">
  5.     <ListCarsResult>
  6.      <CAR_list xmlns="http://blablabla.com/webservices/CAR_list.xsd">
  7.       <Product ProductId="13956" provider="MySelf" name="Peugeot" type="106">
  8.        <ColorType productId="13956;19630" name="Black">
  9.        </ColorType>
  10.       </Product>
  11.       <Product ProductId="22568" provider="MySelf" name="Peugeot" type="406">
  12.        <ColorType productId="22568;24575" name="Red">
  13.        </ColorType>
  14.       </Product>
  15.      </CAR_list>
  16.     </ListCarsResult>
  17.    </ListCarsResponse>
  18. </soap:Body>
  19. </soap:Envelope>


 
si je simplifie mon fichier comme ça :
 

Code :
  1. <?xml version="1.0" encoding="utf-8"?>
  2.      <CAR_list xmlns="http://blablabla.com/webservices/CAR_list.xsd">
  3.       <Product ProductId="13956" provider="MySelf" name="Peugeot" type="106">
  4.        <ColorType productId="13956;19630" name="Black">
  5.        </ColorType>
  6.       </Product>
  7.       <Product ProductId="22568" provider="MySelf" name="Peugeot" type="406">
  8.        <ColorType productId="22568;24575" name="Red">
  9.        </ColorType>
  10.       </Product>
  11.      </CAR_list>


 
alors avec quelques « foreach », je récupere ce que je veux ..
 
 
 

Code :
  1. $Product = $xml->xpath('//Product');
  2. foreach ($xml as $Product) {
  3. echo $Product['ProductId']."<BR>";
  4. echo $Product['name']."<BR>";
  5. echo $Product['type']."<BR>";
  6. foreach ($Product as $ColorType) {
  7. echo $ColorType['productId']."<BR>";
  8. echo $ColorType['name']."<BR>";
  9. }
  10. }


 
Mais comment faire face à la structure que je reçois ?
A cause notamment des « : » dans le tag de « Body » ou celui d’ « Envelop » je n’arrive pas a exprimer mon xpath.
 
Quelqu’un a-t-il une solution ??
 
Merci d’avance

Reply

Marsh Posté le 30-07-2006 à 19:25:25   

Reply

Marsh Posté le 30-07-2006 à 21:17:55    

Si je ne me trompe pas avec

Code :
  1. $xml->registerXPathNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/');
  2. $Product = $xml->xpath('//soap:Product');

Cela dit n'oublie pas qu'il y a une API SOAP dans PHP...

Reply

Marsh Posté le 30-07-2006 à 22:05:23    

Tu peux te tourner vers l'analyseur syntaxique XML de PHP et notamment la fonction xml_parser_create_ns()

Reply

Marsh Posté le 31-07-2006 à 14:41:17    

Bonjour rx_,
 
Merci de ton conseil. Je pensais effectivement explorer du coté de "registerXPathNamespace". Mais j'ai du mal à faire fonctionner mon exemple avec... Pourtant, je pense que ça doit aporter la solution que je recherche...Peux-tu regader à nouveau?

Reply

Marsh Posté le 31-07-2006 à 20:58:13    

Effectivement je n'arrive pas à charger le document, il est vide après le simplexml_load_file ou _load_string. Ca semble venir du namespace parce qu'avec ce document-ci ça marche

Code :
  1. <?xml version='1.0'?>
  2. <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
  3. <Body />
  4. </Envelope>

mais avec celui-ci ça ne marche pas

Code :
  1. <?xml version='1.0'?>
  2. <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  3. <soap:Body />
  4. </soap:Envelope>

Pourtant sémantiquement c'est équivalent...
 
Donc comme dit Sho320, tu peux jeter un coup d'oeil à l'autre API XML.

Reply

Marsh Posté le 31-07-2006 à 23:51:49    

Ok les amis, vos conseils ont guidés mes recherches et j'ai trouvé un truc très sympa sur la toile, surtout pour ce comme moi qui ne maitrise pas bien le parsing xml en PHP5...
http://www.ctindustries.net/talks/ [...] eb_srv.ppt  
Voici le lien, bonne doc avec plein d'exemples, c'est relativement complet et mérite à mon sens à être connu !
 
Bonne fin de soirée et a bientôt,

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed