Importer XML -> Mysql (DOM)

Eléphanteau du PHP | 38 Messages

15 mai 2012, 23:26

Bonjour,
Je souhaite importer à la volée différentes valeurs contenus dans un fichier XML.
Je récupère bien les données souhaitées mais l'insertion ne prend en compte que la dernière valeur des éléments voulus.

Voici le XML en question

[xml]
<ns1:Order OrderID="1-2012.115.0713702" OrderDate="2012-04-24T13:17:42+02:00" CurrencyCode="EUR">
<ns1:OrderLine OrderLineID="2229-1-2012.115.0713702-7" StatusCode="Accepted" StatusDate="2012-04-25T15:16:58.748+02:00">
<ns1:Item ItemRedouteID="0WPMP7GH" ItemStandardID="">
<ns1:Offer OfferID="13944147" SellerOfferID="8999">
<ns1:InitialSellingPrice>3.8E1</ns1:InitialSellingPrice>
<ns1:DiscountedSellingPrice>3.8E1</ns1:DiscountedSellingPrice>
<ns1:WEEEFee>0.0E0</ns1:WEEEFee>
<ns1:Delivery DeliveryMode="Home" DeliveryType="Regular">
<ns1:DeliveryFee>5.0E0</ns1:DeliveryFee>
<ns1:DeliveryInstruction>TEL AVANT CERET POUR QUE LA CLIENTE INDIQUE LE CHEMIN</ns1:DeliveryInstruction>
<ns1:DeliveryAddress>
<ns1:Name1> </ns1:Name1>
<ns1:Address1> </ns1:Address1>
<ns1:ZIPCode>66400</ns1:ZIPCode>
<ns1:City>TAILLET</ns1:City>
<ns1:CountryCode>FR</ns1:CountryCode>
</ns1:DeliveryAddress>
</ns1:Delivery>
</ns1:Offer>
</ns1:Item>
<ns1:Quantity QuantityQualifier="1" MeasureUnit="H87">1.0E0</ns1:Quantity>
<ns1:CreationLog CreationDate="2012-04-24T13:17:46.136+02:00"/>
<ns1:UpdateLog UpdateDate="2012-04-25T15:16:58.748+02:00"/>
</ns1:OrderLine>
<ns1:BillingAddress>
<ns1:Name1> </ns1:Name1>
<ns1:Address1> </ns1:Address1>
<ns1:ZIPCode> </ns1:ZIPCode>
<ns1:City> </ns1:City>
<ns1:CountryCode>FR</ns1:CountryCode>
</ns1:BillingAddress>
<ns1:ReceiverCustomer CustomerID="1-173181841"/>
</ns1:Order>
<ns1:Order OrderID="1-2012.115.0824598" OrderDate="2012-04-24T17:26:56+02:00" CurrencyCode="EUR">
<ns1:OrderLine OrderLineID="2229-1-2012.115.0824598-5" StatusCode="Accepted" StatusDate="2012-04-25T15:17:20.873+02:00">
<ns1:Item ItemRedouteID="0WPMPYPN" ItemStandardID="">
<ns1:Offer OfferID="14009275" SellerOfferID="9614">
<ns1:InitialSellingPrice>2.28E2</ns1:InitialSellingPrice>
<ns1:DiscountedSellingPrice>2.28E2</ns1:DiscountedSellingPrice>
<ns1:WEEEFee>0.0E0</ns1:WEEEFee>
<ns1:Delivery DeliveryMode="Home" DeliveryType="Regular">
<ns1:DeliveryFee>0.0E0</ns1:DeliveryFee>
<ns1:DeliveryAddress>
<ns1:Name1> </ns1:Name1>
<ns1:Address1> </ns1:Address1>
<ns1:ZIPCode>59100</ns1:ZIPCode>
<ns1:City>ROUBAIX</ns1:City>
<ns1:CountryCode>FR</ns1:CountryCode>
</ns1:DeliveryAddress>
</ns1:Delivery>
</ns1:Offer>
</ns1:Item>
<ns1:Quantity QuantityQualifier="1" MeasureUnit="H87">1.0E0</ns1:Quantity>
<ns1:CreationLog CreationDate="2012-04-24T17:26:58.041+02:00"/>
<ns1:UpdateLog UpdateDate="2012-04-25T15:17:20.873+02:00"/>
</ns1:OrderLine>
<ns1:BillingAddress>
<ns1:Name1> </ns1:Name1>
<ns1:Address1> </ns1:Address1>
<ns1:ZIPCode> </ns1:ZIPCode>
<ns1:City> </ns1:City>
<ns1:CountryCode>FR</ns1:CountryCode>
</ns1:BillingAddress>
<ns1:ReceiverCustomer CustomerID="1-608988424"/>
</ns1:Order>
<ns1:Order OrderID="1-2012.115.0765303" OrderDate="2012-04-24T15:33:17+02:00" CurrencyCode="EUR">
<ns1:OrderLine OrderLineID="2229-1-2012.115.0765303-1" StatusCode="Accepted" StatusDate="2012-04-25T15:17:42.209+02:00">
<ns1:Item ItemRedouteID="0WPMP6JF" ItemStandardID="">
<ns1:Offer OfferID="13943893" SellerOfferID="3492">
<ns1:InitialSellingPrice>3.9E1</ns1:InitialSellingPrice>
<ns1:DiscountedSellingPrice>3.9E1</ns1:DiscountedSellingPrice>
<ns1:WEEEFee>0.0E0</ns1:WEEEFee>
<ns1:Delivery DeliveryMode="Home" DeliveryType="Regular">
<ns1:DeliveryFee>5.0E0</ns1:DeliveryFee>
<ns1:DeliveryAddress>
<ns1:Name1> </ns1:Name1>
<ns1:Address1> </ns1:Address1>
<ns1:ZIPCode>03100</ns1:ZIPCode>
<ns1:City>MONTLUCON</ns1:City>
<ns1:CountryCode>FR</ns1:CountryCode>
</ns1:DeliveryAddress>
</ns1:Delivery>
</ns1:Offer>
</ns1:Item>
<ns1:Quantity QuantityQualifier="1" MeasureUnit="H87">1.0E0</ns1:Quantity>
<ns1:CreationLog CreationDate="2012-04-24T15:33:19.823+02:00"/>
<ns1:UpdateLog UpdateDate="2012-04-25T15:17:42.209+02:00"/>
</ns1:OrderLine>
<ns1:BillingAddress>
<ns1:Name1> </ns1:Name1>
<ns1:Address1> </ns1:Address1>
<ns1:ZIPCode> </ns1:ZIPCode>
<ns1:City> </ns1:City>
<ns1:CountryCode>FR</ns1:CountryCode>
</ns1:BillingAddress>
<ns1:ReceiverCustomer CustomerID="1-591386271"/>
</ns1:Order>
[/xml]

Voici mon traitement des données avec DOM
$dom = new DomDocument;
	$dom->load('2229.MKP_OrderResponse.001.2012-05-14-15-51-33.xml');
	
	
	$listeorder = $dom->getElementsByTagName('Order');
	foreach($listeorder as $order)
		echo "OrderID: " .$order->getAttribute("OrderID") . "<br />";
$order_id = $order->getAttribute("OrderID");
	foreach($listeorder as $order)
		echo "OrderDate: " .$order->getAttribute("OrderDate") . "<br />";
	$listeorderline = $dom->getElementsByTagName('OrderLine');
	foreach($listeorderline as $orderline)
		echo "OrderlineID: " .$orderline->getAttribute("OrderLineID") . "<br />";
		$orderlineID = $orderline->getAttribute("OrderLineID");
	foreach($listeorderline as $orderline)
		echo "StatusCode: " .$orderline->getAttribute("StatusCode") . "<br />"; 
		$status = $orderline->getAttribute("StatusCode");
	$listeitem = $dom->getElementsByTagName('Item');
	foreach($listeitem as $item)
		echo "ItemStandardID: " .$item->getAttribute("ItemStandardID") . "<br />";
	$listeproductid = $dom->getElementsByTagName('Offer');
	foreach($listeproductid as $product_id)
		echo "ProductID: " .$product_id->getAttribute("SellerOfferID") . "<br />";
$id_product = $product_id->getAttribute("SellerOfferID");
	$listeprice = $dom->getElementsByTagName('InitialSellingPrice');
	foreach($listeprice as $initialprice)
		echo "InitialSellingPrice: " .((double)$initialprice->firstChild->nodeValue) . "<br />";
	$listepricediscount = $dom->getElementsByTagName('DiscountedSellingPrice');
	foreach($listepricediscount as $discountprice)
		echo "DiscountedSellingPrice: " .((double)$discountprice->firstChild->nodeValue) . "<br />";
	$listedelivery = $dom->getElementsByTagName('DeliveryFee');
	foreach($listedelivery as $delivery_fee)
		echo "DeliveryFee: " .((double)$delivery_fee->firstChild->nodeValue) . "<br />";
	
	foreach ($dom->getElementsByTagName('DeliveryAddress') as $delivery) 
	foreach ($delivery->getElementsByTagName('ZIPCode') as $zip) 
     echo "Code Postal: " .$zip->firstChild->nodeValue . "<br />";
	
	foreach ($dom->getElementsByTagName('DeliveryAddress') as $delivery)
	foreach ($delivery->getElementsByTagName('City') as $ville) 
		echo "Ville: " .$ville->firstChild->nodeValue . "<br />";
		
	foreach ($dom->getElementsByTagName('DeliveryAddress') as $delivery)
	foreach ($delivery->getElementsByTagName('CountryCode') as $country_code)
			echo "Pays: " .$country_code->firstChild->nodeValue . "<br />";
	
	
	$quantite = $dom->getElementsByTagName('Quantity');
	foreach($listeorderline as $orderline)
		echo "Quantité: ".((double)$quantite) . "<br />";
		
	$listecustomerid = $dom->getElementsByTagName('ReceiverCustomer');
	foreach($listecustomerid as $customer)
		echo "CustomerID: " .$customer->getAttribute("CustomerID") . "<br />";
		$customer = $customer->getAttribute("CustomerID");

$insert_order = "INSERT INTO ps_redoute_order VALUES ('', '".$orderlineID."', '".$order_id."', 'Madame', 'Client', 'Redoute', '', '', '', '".$customer ."@redoute.fr"."', '', '', '".$zip->firstChild->nodeValue ."', '".$ville->firstChild->nodeValue ."', '".$country_code->firstChild->nodeValue ."', '".((double)$discountprice->firstChild->nodeValue) ."', '".((double)$delivery_fee->firstChild->nodeValue) ."', '".$customer."')";
		$order = mysql_query($insert_order, $base) or die(mysql_error());
L'insertion s'effectue mais seule la dernière valeur des éléments sélectionnés s'insère.
Ce qui fait qu'au final je n'ai qu'une seule ligne insérée.
Je souhaite que l'insertion s'effectue à la volée pour les différentes valeurs rencontrées.

Je vous remercie d'avance pour votre aide et votre compréhension.
Nats

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

16 mai 2012, 11:03

salut,

ton code ne fait qu'un seule insertion c'est normal :)
tu parcours plusieurs fois les mêmes noeuds alors que tu peux le faire qu'une seule fois et utiliser xpath pour avoir les infos (par exemple).

ce que tu doit faire

pour chaque "order"
récupérer les infos
insérer les infos

Tu peux, aussi, utiliser les requêtes préparée pour faire un truc un poil plus performant (c'est réalisable avec l'extension mysql ou avec PDO).

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 38 Messages

17 mai 2012, 09:43

Merci Moogli,

J'ai pu arriver à mes fins ainsi
<?php
$dom = new DomDocument;
$dom->load($filename);
$listeorder = $dom->getElementsByTagName('Order');
foreach($listeorder as $order){
 echo "OrderID: " .$order->getAttribute("OrderID") . "<br />";
 $order_id = $order->getAttribute("OrderID");
 echo "OrderDate: " .$order->getAttribute("OrderDate") . "<br />";
foreach ($order->getElementsByTagName('OrderLine') as $orderline){
 echo "OrderlineID: " .$orderline->getAttribute("OrderLineID") . "<br />";
 $orderlineID = $orderline->getAttribute("OrderLineID");
 echo "StatusCode: " .$orderline->getAttribute("StatusCode") . "<br />"; 
}
foreach ($order->getElementsByTagName('Offer') as $product_id){
 echo "ProductID: " .$product_id->getAttribute("SellerOfferID") . "<br />";
 $id_product = $product_id->getAttribute("SellerOfferID");
}
foreach ($order->getElementsByTagName('InitialSellingPrice') as $initialprice){
 echo "InitialSellingPrice: " .((double)$initialprice->firstChild->nodeValue) . "<br />";
}
foreach ($order->getElementsByTagName('DiscountedSellingPrice') as $discountprice){
 echo "DiscountedSellingPrice: " .((double)$discountprice->firstChild->nodeValue) . "<br />";
}
foreach ($order->getElementsByTagName('DeliveryFee') as $delivery_fee){
 echo "DeliveryFee: " .((double)$delivery_fee->firstChild->nodeValue) . "<br />";
}
foreach ($order->getElementsByTagName('DeliveryAddress') as $delivery){
 foreach ($delivery->getElementsByTagName('ZIPCode') as $zip){
  echo "Code Postal: " .$zip->firstChild->nodeValue . "<br />";
 }
 foreach ($delivery->getElementsByTagName('City') as $ville){
  echo "Ville: " .$ville->firstChild->nodeValue . "<br />";
 }
 foreach ($delivery->getElementsByTagName('CountryCode') as $country_code){
  echo "Pays: " .$country_code->firstChild->nodeValue . "<br />";
 }
}
foreach ($order->getElementsByTagName('Quantity') as $quantite){
 echo "Quantité: " .((double)$quantite->firstChild->nodeValue) . "<br />";
}
foreach ($order->getElementsByTagName('ReceiverCustomer') as $customer){
 echo "CustomerID: " .$customer->getAttribute("CustomerID") . "<br />";
 $customer = $customer->getAttribute("CustomerID");
}
$insert_order = "INSERT INTO ps_redoute_order VALUES ('', '".$orderlineID."', '".$order_id."', 'Madame', 'Client', 'Redoute', '', '', '', '".$order_id ."@redoute.fr"."', '', '', '".$zip->firstChild->nodeValue ."', '".$ville->firstChild->nodeValue ."', '".$country_code->firstChild->nodeValue ."', '".((double)$discountprice->firstChild->nodeValue) ."', '".((double)$delivery_fee->firstChild->nodeValue) ."', '".$customer."')";
$order = mysql_query($insert_order, $base) or die(mysql_error());
}
?>


Nats