Importer XML -> Mysql (DOM)

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Importer XML -> Mysql (DOM)

Re: Importer XML -> Mysql (DOM)

par nats » 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());
}
?>


Re: Importer XML -> Mysql (DOM)

par moogli » 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).

@+

Importer XML -> Mysql (DOM)

par nats » 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.