Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

recuperation de donnees xml en ph p pour insertion dans MySQL

5 réponses
Avatar
Anne
Bonjour,
Je ne suis pas très à l'aise avec xml et je sèche sur une manière de le
faire.
Si quelqu'un pouvait m'aider, merci.
Voici mon code :
<?
$ch =
curl_init("http://cdt33.tourinsoft.com/soft/RechercheDynamique/Syndication/controle/syndication.asmx/getListing?idModule=843b3e01-7366-4982-b16d-41e6c88d55ec");
ob_start();
curl_exec($ch);
curl_close($ch);
$fichier_XML = ob_get_contents();
ob_end_clean();

$xml_parser = xml_parser_create();
xml_parse_into_struct($xml_parser, $fichier_XML, $vals, $index);
xml_parser_free($xml_parser);

$dans_listing = 0;
$nb_listing = 0;

foreach ($vals as $xml_elem) {
if ($xml_elem["tag"]=='LISTING' && $xml_elem["type"] == 'open')
{$dans_listing = 1;$nb_listing++;}
if ($xml_elem["tag"]=='LISTING' && $xml_elem["type"] == 'close')
$dans_listing = 0;
if ($xml_elem["tag"]=='ID' && $dans_listing) $listing_id[$nb_listing]
= $xml_elem["value"];
if ($xml_elem["tag"]=='DATECREA' && $dans_listing)
$listing_datecrea[$nb_listing] = $xml_elem["value"];
}

// Hotels
echo "Nombre d'hotels = ".$nb_listing."<br>";

for ($i=1;$i<=$nb_listing;$i++) {
$listing_id = $listing_id[$i];
$listing_datecrea = $listing_datecrea[$i];
echo "ID = ".$listing_id."<br>";
echo "DATECREA = ".$listing_datecrea."<br>";
}
?>

Le flux xml que j'interroge est de la forme :

<?xml version="1.0" encoding="utf-8" ?>
- <DataSet xmlns="http://www.faire-savoir.com/webservices/">
- <xs:schema id="Listing" xmlns=""
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
- <xs:element name="Listing" msdata:IsDataSet="true" msdata:Locale="fr-FR">
- <xs:complexType>
- <xs:choice maxOccurs="unbounded">
- <xs:element name="LISTING">
- <xs:complexType>
- <xs:sequence>
<xs:element name="ID" type="xs:string" minOccurs="0" />
<xs:element name="DATECREA" type="xs:dateTime" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
- <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
- <Listing xmlns="">
- <LISTING diffgr:id="LISTING1" msdata:rowOrder="0"
diffgr:hasChanges="inserted">
<ID>HOTAQU03301V3C4G</ID>
<DATECREA>2005-06-29T00:00:00.0000000+02:00</DATECREA>
</LISTING>
- <LISTING diffgr:id="LISTING2" msdata:rowOrder="1"
diffgr:hasChanges="inserted">
<ID>HOTAQU03301V3E8P</ID>
<DATECREA>2005-06-29T00:00:00.0000000+02:00</DATECREA>
</LISTING>
- <LISTING diffgr:id="LISTING3" msdata:rowOrder="2"
diffgr:hasChanges="inserted">
<ID>HOTAQU03301V3D3I</ID>
<DATECREA>2005-06-29T00:00:00.0000000+02:00</DATECREA>
</LISTING>
- <LISTING diffgr:id="LISTING4" msdata:rowOrder="3"
diffgr:hasChanges="inserted">
<ID>HOTAQU03301V3E50</ID>
<DATECREA>2005-06-29T00:00:00.0000000+02:00</DATECREA>
</LISTING>
</Listing>
</diffgr:diffgram>
</DataSet>

et je ne souhaite que prendre les noeuds <ID> et <DATECREA>
Je n'arrive pas à les atteindre...

Merci pour toute contribution.

5 réponses

Avatar
Florian Sinatra
*Anne* @ 08/09/2006 16:34 :
Bonjour,
Je ne suis pas très à l'aise avec xml et je sèche sur une manière de le
faire.
Si quelqu'un pouvait m'aider, merci.
Voici mon code :
<?
$ch > curl_init("[...]");
ob_start();
curl_exec($ch);
curl_close($ch);
$fichier_XML = ob_get_contents();
ob_end_clean();


As-tu vraiment besoin de cURL ? Si oui, regarde l'option
CURLOPT_RETURNTRANSFER de curl_setopt().

$xml_parser = xml_parser_create();
xml_parse_into_struct($xml_parser, $fichier_XML, $vals, $index);
xml_parser_free($xml_parser);


De quelle version de PHP disposes-tu ? Si tu peux, essaie de voir du
côté de SimpleXML (http://ch2.php.net/manual/fr/ref.simplexml.php) ou au
pire de DOM XML (http://ch2.php.net/manual/fr/ref.domxml.php) ;-)

Avatar
Anne
Florian Sinatra a écrit:
As-tu vraiment besoin de cURL ? Si oui, regarde l'option
CURLOPT_RETURNTRANSFER de curl_setopt().

De quelle version de PHP disposes-tu ? Si tu peux, essaie de voir du
côté de SimpleXML (http://ch2.php.net/manual/fr/ref.simplexml.php) ou au
pire de DOM XML (http://ch2.php.net/manual/fr/ref.domxml.php) ;-)



J'ai la version 4.4.4
J'ai utlisé DOM XML comme vous le suggérez. Je récupère les valeurs de
la plupart des noeuds, sauf ceux où l'intitulé du noeud contient un accent !

$node_categorie = $root->get_elements_by_tagname("Catégorie" );
echo utf8_decode($node_categorie[$i]->get_content());
Cela me met : Fatal error:Call to a member function on a non-object...

Je ne peux pas modifier le fichier xml d'origine.
Est ce que vous avez une idée de comment faire ?

Merci beaucoup.

Avatar
Olivier Miakinen

J'ai utlisé DOM XML comme vous le suggérez. Je récupère les valeurs de
la plupart des noeuds, sauf ceux où l'intitulé du noeud contient un accent !

$node_categorie = $root->get_elements_by_tagname("Catégorie" );


Ta page est probablement en Latin1 puisque tu utilises utf8_decode juste
après. À mon avis, tu devrais soit passer ta page en UTF-8 (ce qui
impose de changer le format de sauvegarde du fichier mais aussi de
changer la déclaration de charset et de virer les utf8_decode), soit
appeler utf8_encode sur tes intitulés de n½uds.

Dans la seconde hypothèse, ce sera :
$root->get_elements_by_tagname(utf8_encode("Catégorie"))

Avatar
Anne
Olivier Miakinen a écrit:

J'ai utlisé DOM XML comme vous le suggérez. Je récupère les valeurs de
la plupart des noeuds, sauf ceux où l'intitulé du noeud contient un accent !

$node_categorie = $root->get_elements_by_tagname("Catégorie" );



Ta page est probablement en Latin1 puisque tu utilises utf8_decode juste
après. À mon avis, tu devrais soit passer ta page en UTF-8 (ce qui
impose de changer le format de sauvegarde du fichier mais aussi de
changer la déclaration de charset et de virer les utf8_decode), soit
appeler utf8_encode sur tes intitulés de n½uds.

Dans la seconde hypothèse, ce sera :
$root->get_elements_by_tagname(utf8_encode("Catégorie"))


Merci !
J'ai cependant un autre problème...
Le document xml contient parfois des noeuds vide et cela provoque la
même erreur...
J'ai essayé de tester par un $node_categorie[$i]->has_attributes(), mais
sans succès...


Avatar
Anne
Olivier Miakinen a écrit:

J'ai utlisé DOM XML comme vous le suggérez. Je récupère les valeurs de
la plupart des noeuds, sauf ceux où l'intitulé du noeud contient un accent !

$node_categorie = $root->get_elements_by_tagname("Catégorie" );



Ta page est probablement en Latin1 puisque tu utilises utf8_decode juste
après. À mon avis, tu devrais soit passer ta page en UTF-8 (ce qui
impose de changer le format de sauvegarde du fichier mais aussi de
changer la déclaration de charset et de virer les utf8_decode), soit
appeler utf8_encode sur tes intitulés de n½uds.

Dans la seconde hypothèse, ce sera :
$root->get_elements_by_tagname(utf8_encode("Catégorie"))



Merci !