2012-04-09 3 views
2

Lassen Sie mich zuerst mit dem, was wir hier tun: Wir ziehen eine XML-Datei von 1 Server und platzieren sie auf einem anderen Server, wo ist der PHP Code sitzt auch. Dann müssen einige der XML-Daten in eine lokale MySQL-Datenbank importiert werden. Das XML ist eine Kopie von Bestellungen für einen Online-Shop. Manche Bestellungen enthalten mehrere bestellte Artikel, andere nicht, wenn sie nur einen Artikel bestellen.Importieren eines XML in MySQL, kann nicht alle Kinder Tags erhalten

So für das XML-Beispiel haben wir:

<?xml version="1.0" encoding="UTF-8"?> 
<xmldata> 
    <Orders> 
    <OrderID>2119</OrderID> 
    <AddressValidated>Y</AddressValidated> 
    <Affiliate_Commissionable_Value>2.0000</Affiliate_Commissionable_Value> 
    <AuthHash>d995fd9424fb99e80f58841a0ff2340f</AuthHash> 
    <AVS /> 
    <BillingAddress1>122 27th West</BillingAddress1> 
    <BillingAddress2>Floor 11</BillingAddress2> 
    <BillingCity>New York</BillingCity> 
    <BillingCompanyName /> 
    <BillingCountry>United States</BillingCountry> 
    <BillingFaxNumber /> 
    <BillingFirstName>Dan</BillingFirstName> 
    <BillingLastName>Test</BillingLastName> 
    <BillingPhoneNumber>646456777</BillingPhoneNumber> 
    <BillingPostalCode>10001</BillingPostalCode> 
    <BillingState>NY</BillingState> 
    <CardHoldersName /> 
    <CC_Last4 /> 
    <CreditCardAuthorizationDate>3/30/2012 11:52:00 AM</CreditCardAuthorizationDate> 
    <CreditCardAuthorizationNumber>MANUAL</CreditCardAuthorizationNumber> 
    <CreditCardTransactionID /> 
    <Customer_IPAddress>184.56.49.45</Customer_IPAddress> 
    <CustomerID>19</CustomerID> 
    <CVV2_Response /> 
    <GiftWrapNote /> 
    <IsAGift>N</IsAGift> 
    <LastModBy>7</LastModBy> 
    <LastModified>3/30/2012 1:39:00 PM</LastModified> 
    <Locked>Y</Locked> 
    <Order_Comments>Test sale - Don't process 
Ignore statuses on this order</Order_Comments> 
    <Order_Entry_System>PHONE</Order_Entry_System> 
    <OrderDate>3/30/2012 11:01:00 AM</OrderDate> 
    <OrderNotes /> 
    <OrderStatus>Ready to Ship</OrderStatus> 
    <PaymentAmount>8.1600</PaymentAmount> 
    <PaymentMethodID>17</PaymentMethodID> 
    <PONum /> 
    <Processed_AutoEvents>Y</Processed_AutoEvents> 
    <SalesRep_CustomerID>7</SalesRep_CustomerID> 
    <SalesTax1>0.1700</SalesTax1> 
    <SalesTax2>0.0000</SalesTax2> 
    <SalesTax3>0.0000</SalesTax3> 
    <SalesTaxRate>0</SalesTaxRate> 
    <SalesTaxRate1>0.08375</SalesTaxRate1> 
    <SalesTaxRate2>0</SalesTaxRate2> 
    <SalesTaxRate3>0</SalesTaxRate3> 
    <ShipAddress1>123 27th West</ShipAddress1> 
    <ShipAddress2>Floor 1</ShipAddress2> 
    <ShipCity>New York</ShipCity> 
    <ShipCompanyName /> 
    <ShipCountry>United States</ShipCountry> 
    <ShipFaxNumber /> 
    <ShipFirstName>Dan</ShipFirstName> 
    <ShipLastName>Test</ShipLastName> 
    <ShipPhoneNumber>646782342</ShipPhoneNumber> 
    <Shipping_Locked>Y</Shipping_Locked> 
    <ShippingMethodID>1</ShippingMethodID> 
    <ShipPostalCode>10001</ShipPostalCode> 
    <ShipResidential>Y</ShipResidential> 
    <ShipState>NY</ShipState> 
    <Stock_Priority>3</Stock_Priority> 
    <Tax1_IgnoreNoTaxRules /> 
    <Tax1_Title>Tax (8.375%)</Tax1_Title> 
    <Tax2_IgnoreNoTaxRules /> 
    <Tax2_IncludePrevious>0</Tax2_IncludePrevious> 
    <Tax2_Title /> 
    <Tax3_IgnoreNoTaxRules /> 
    <Tax3_IncludePrevious>0</Tax3_IncludePrevious> 
    <Tax3_Title /> 
    <Total_Payment_Authorized>0.0000</Total_Payment_Authorized> 
    <Total_Payment_Received>7.0700</Total_Payment_Received> 
    <TotalShippingCost>5.9900</TotalShippingCost> 
    <VendorID>0</VendorID> 
    <OrderDetails> 
     <OrderDetailID>3374</OrderDetailID> 
     <AutoDropShip>Y</AutoDropShip> 
     <FreeShippingItem>Y</FreeShippingItem> 
     <GiftTrakNumber>0</GiftTrakNumber> 
     <GiftWrap /> 
     <GiftWrapCost>0.0000</GiftWrapCost> 
     <GiftWrapNote /> 
     <IsKitID /> 
     <KitID /> 
     <Locked>Y</Locked> 
     <OnOrder_Qty>0</OnOrder_Qty> 
     <OptionIDs /> 
     <Options /> 
     <OrderID>2119</OrderID> 
     <ProductCode>test-product</ProductCode> 
     <ProductID>39200</ProductID> 
     <ProductName>Test Product 1</ProductName> 
     <ProductNote /> 
     <ProductPrice>1.0000</ProductPrice> 
     <ProductWeight>1</ProductWeight> 
     <QtyOnBackOrder>0</QtyOnBackOrder> 
     <QtyOnHold>1</QtyOnHold> 
     <QtyShipped>0</QtyShipped> 
     <Quantity>1</Quantity> 
     <TaxableProduct>Y</TaxableProduct> 
     <TotalPrice>1.0000</TotalPrice> 
     <Vendor_Price>0.0000</Vendor_Price> 
     <Warehouses /> 
    </OrderDetails> 
    <OrderDetails> 
     <OrderDetailID>3386</OrderDetailID> 
     <AutoDropShip /> 
     <FreeShippingItem>Y</FreeShippingItem> 
     <GiftTrakNumber>0</GiftTrakNumber> 
     <GiftWrap /> 
     <GiftWrapCost>0.0000</GiftWrapCost> 
     <GiftWrapNote /> 
     <Locked>Y</Locked> 
     <OnOrder_Qty>0</OnOrder_Qty> 
     <Options /> 
     <OrderID>2119</OrderID> 
     <ProductCode>test-product</ProductCode> 
     <ProductID>39200</ProductID> 
     <ProductName>Test Product 2</ProductName> 
     <ProductNote /> 
     <ProductPrice>1.0000</ProductPrice> 
     <ProductWeight>1</ProductWeight> 
     <QtyOnBackOrder>0</QtyOnBackOrder> 
     <QtyOnHold>1</QtyOnHold> 
     <QtyShipped>0</QtyShipped> 
     <Quantity>1</Quantity> 
     <TaxableProduct>Y</TaxableProduct> 
     <TotalPrice>1.0000</TotalPrice> 
    </OrderDetails> 
    </Orders> 
    <Orders> 
    <OrderID>2141</OrderID> 
    <AddressValidated>Y</AddressValidated> 
    <Affiliate_Commissionable_Value>1.0000</Affiliate_Commissionable_Value> 
    <AuthHash>14cca8be8db44ca9943f0a6cbf592c83</AuthHash> 
    <AVS /> 
    <BillingAddress1>122 27th West2</BillingAddress1> 
    <BillingAddress2 /> 
    <BillingCity>New York2</BillingCity> 
    <BillingCompanyName /> 
    <BillingCountry>United States</BillingCountry> 
    <BillingFaxNumber /> 
    <BillingFirstName>Dan2</BillingFirstName> 
    <BillingLastName>Test2</BillingLastName> 
    <BillingPhoneNumber>646346322</BillingPhoneNumber> 
    <BillingPostalCode>10002</BillingPostalCode> 
    <BillingState>NY</BillingState> 
    <CardHoldersName /> 
    <CC_Last4 /> 
    <CreditCardAuthorizationDate>3/30/2012 3:33:00 PM</CreditCardAuthorizationDate> 
    <CreditCardAuthorizationNumber>MANUAL</CreditCardAuthorizationNumber> 
    <CreditCardTransactionID /> 
    <Customer_IPAddress>56.75.23.34</Customer_IPAddress> 
    <CustomerID>19</CustomerID> 
    <CVV2_Response /> 
    <GiftWrapNote /> 
    <IsAGift>N</IsAGift> 
    <LastModBy>7</LastModBy> 
    <LastModified>3/30/2012 3:33:00 PM</LastModified> 
    <Locked>Y</Locked> 
    <Order_Comments>Test sale #2, don't process, ignore status.</Order_Comments> 
    <Order_Entry_System>PHONE</Order_Entry_System> 
    <OrderDate>3/30/2012 3:32:00 PM</OrderDate> 
    <OrderNotes /> 
    <OrderStatus>Ready to Ship</OrderStatus> 
    <PaymentAmount>7.0700</PaymentAmount> 
    <PaymentMethodID>17</PaymentMethodID> 
    <PONum /> 
    <Processed_AutoEvents>Y</Processed_AutoEvents> 
    <SalesRep_CustomerID>7</SalesRep_CustomerID> 
    <SalesTax1>0.0800</SalesTax1> 
    <SalesTax2>0.0000</SalesTax2> 
    <SalesTax3>0.0000</SalesTax3> 
    <SalesTaxRate>0</SalesTaxRate> 
    <SalesTaxRate1>0.08375</SalesTaxRate1> 
    <SalesTaxRate2>0</SalesTaxRate2> 
    <SalesTaxRate3>0</SalesTaxRate3> 
    <ShipAddress1>123 27th West2</ShipAddress1> 
    <ShipAddress2 /> 
    <ShipCity>New York2</ShipCity> 
    <ShipCompanyName /> 
    <ShipCountry>United States</ShipCountry> 
    <ShipFaxNumber /> 
    <ShipFirstName>Dan2</ShipFirstName> 
    <ShipLastName>Test2</ShipLastName> 
    <ShipPhoneNumber>6461234789</ShipPhoneNumber> 
    <Shipping_Locked>Y</Shipping_Locked> 
    <ShippingMethodID>1</ShippingMethodID> 
    <ShipPostalCode>10002</ShipPostalCode> 
    <ShipResidential>Y</ShipResidential> 
    <ShipState>NY</ShipState> 
    <Stock_Priority>3</Stock_Priority> 
    <Tax1_IgnoreNoTaxRules /> 
    <Tax1_Title>Tax (8.375%)</Tax1_Title> 
    <Tax2_IgnoreNoTaxRules /> 
    <Tax2_IncludePrevious>0</Tax2_IncludePrevious> 
    <Tax2_Title /> 
    <Tax3_IgnoreNoTaxRules /> 
    <Tax3_IncludePrevious>0</Tax3_IncludePrevious> 
    <Tax3_Title /> 
    <Total_Payment_Authorized>0.0000</Total_Payment_Authorized> 
    <Total_Payment_Received>7.0700</Total_Payment_Received> 
    <TotalShippingCost>5.9900</TotalShippingCost> 
    <VendorID>0</VendorID> 
    <OrderDetails> 
     <OrderDetailID>3404</OrderDetailID> 
     <AutoDropShip>Y</AutoDropShip> 
     <FreeShippingItem>Y</FreeShippingItem> 
     <GiftTrakNumber>0</GiftTrakNumber> 
     <GiftWrap /> 
     <GiftWrapCost>0.0000</GiftWrapCost> 
     <GiftWrapNote /> 
     <IsKitID /> 
     <KitID /> 
     <Locked>Y</Locked> 
     <OnOrder_Qty>0</OnOrder_Qty> 
     <OptionIDs /> 
     <Options /> 
     <OrderID>2141</OrderID> 
     <ProductCode>test-product</ProductCode> 
     <ProductID>39200</ProductID> 
     <ProductName>Test Product</ProductName> 
     <ProductNote /> 
     <ProductPrice>1.0000</ProductPrice> 
     <ProductWeight>1</ProductWeight> 
     <QtyOnBackOrder>0</QtyOnBackOrder> 
     <QtyOnHold>1</QtyOnHold> 
     <QtyShipped>0</QtyShipped> 
     <Quantity>1</Quantity> 
     <TaxableProduct>Y</TaxableProduct> 
     <TotalPrice>1.0000</TotalPrice> 
     <Vendor_Price>0.0000</Vendor_Price> 
     <Warehouses /> 
    </OrderDetails> 
    </Orders> 
</xmldata> 

Wie Sie den ersten Auftrag zwei <OrderDetails> während die zweite enthält nur enthält sehen kann.

Ich habe bisher vier Funktionen erstellt, die mich sehr nahe bringen.

processxml(); 
processxmldetails(); 
vl_readytoship_download(); 
csvimport(); 

Der erste importiert die .xml-Datei von dem anderen Server, damit wir zur Arbeit kommen können.

function vl_readytoship_download() { 
echo "Downloading Ready To Ship Orders...<br>"; 
$ch = curl_init("http://www.link.to/vl_rts.xml"); 
$fh = fopen("vl_rts.xml", "w"); 
curl_setopt($ch, CURLOPT_FILE, $fh); 
curl_exec($ch); 
curl_close($ch); 
} 

Die zweite Funktion wandelt die XML CSV so lesen wir es besser für den Import (Dieser Schritt ist nicht erforderlich sein kann, oder die beste Methode, weshalb ich hier bin, aber es funktioniert.)

function processxml() { 
vl_readytoship_download(); 
echo "Processing Ready To Ship Orders...<br>"; 
$filexml='vl_rts.xml'; 
if (file_exists($filexml)) { 
    $xml = simplexml_load_file($filexml); 
$f = fopen('vl_rts.csv', 'w'); 
foreach ($xml->Orders as $Orders) { 
    fputcsv($f, get_object_vars($Orders),',','"'); 
} 
fclose($f); 
} 
} 

Jetzt habe ich auf den ersten Hinweis nicht, dass die CSV die Daten nicht von irgendwelchen <OrderDetails>-Tags enthält. Ich habe es erst erkannt, als ich mit dem Import in MySQL begonnen habe.

Also anstatt rückwärts zu gehen, geschmiedet ich vor die <Order> Daten mindestens importiert zu erhalten:

function csvimport() { 
if(!file_exists("vl_rts.csv")) { echo "WARNING! CSV Not Found!<br>"; exit; } 
$row = 0; 
$mycsvfile = array(); 
if (($handle = fopen("vl_rts.csv", "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     $num = count($data); 
     $row++; 
     for ($c=0; $c < $num; $c++) { 
     } 
     $mycsvfile[] = $data; //add the row to the main array. 
    } 
    fclose($handle); 
} 
echo "<br>Reading Rows:<br>"; 
//[row][column] so [1][$csvrow] = 2nd row, first column since 0=1 
$csvrow = 0; 
while ($mycsvfile[$csvrow][0] != $null) { 
$query = mysql_query("SELECT * from vtiger_purchaseorder WHERE orderid=" . $mycsvfile[$csvrow][0]) or die(mysql_error()); 
if(mysql_num_rows($query)!=0) 
{ 
//if row exists 
$csvrow++; 
echo "Row exists, changing rows...<br>"; 
echo "DO SOMETHING HERE, ANYTHING BUT THIS<br>"; //This is a "todo" spot for later 
} 
else //if row doesn't exist 
{ 

$currentdate = date('Y-m-d'); 
$orderid = $mycsvfile[$csvrow][0]; 
$subject = "Uploading..."; //This is set to Uploading... now, in another function we'll come back change the subject to the name of the item sold. 
$quoteid = $mycsvfile[$csvrow][0]; 
if ($mycsvfile[$csvrow][72] == 0) { 
$vendorid = "1500"; //right now, new orders go into a temp vendor of 1500, then we'll change it based on the product ordered to see which vendor it should be assigned to. 
echo "Vendor is " . $vendorid . "<br>"; 
$shipcity = "Shipcity"; This info is in <OrderDetails> which we don't have yet. 

//This other database is vtiger, which has a lot of different area where it needs to store data, so here we insert it in a way vtiger can accept it. 
$query1 = "SELECT * from vtiger_crmentity"; 
$query2 = "INSERT INTO vtiger_crmentity (smcreatorid,smownerid,modifiedby,setype,orderid) VALUES('1','1','1','PurchaseOrder','" . $orderid . "')"; 

$result1 = mysql_query($query1); 
echo mysql_error() . "<br>"; 
$result2 = mysql_query($query2); 
$crmid = mysql_insert_id(); 

$query3 = "SELECT * from vtiger_purchaseorder"; 
$query4 = "INSERT INTO vtiger_purchaseorder (purchaseorderid,subject,quoteid,vendorid,duedate,orderid) VALUES(" . $crmid . ",'" . $subject . "','" . $quoteid . "','" . $vendorid . "','" . $currentdate . "','" . $orderid . "')"; 

$query5 = "SELECT * from vtiger_poshipads"; 
$query6 = "INSERT INTO vtiger_poshipads (poshipaddressid,ship_city,orderid) VALUES(" . $crmid . ",'" . $shipcity . "','" . $orderid . "')"; 

echo mysql_error() . "<br>"; 
$result3 = mysql_query($query3); 
echo mysql_error() . "<br>"; 
$result4 = mysql_query($query4); 
echo mysql_error() . "<br>"; 
$result5 = mysql_query($query5); 
echo mysql_error() . "<br>"; 
$result6 = mysql_query($query6); 
echo mysql_error() . "<br>"; 
echo "CRMID " . $crmid . "<br>"; 

$csvrow++; 
echo "Order doesn't exist, inserting order number " . $orderid . " from CSV row " . $csvrow . "<br>"; 
//CHANGE ORDER FROM READY TO SHIP TO PENDING SHIPMENT ON OTHER SITE (to do) 


} 
} 
} 
echo "Import Complete.<br>"; 

} 

Jetzt schnell rekapitulieren. Also haben wir die .XML-Datei vom anderen Server gezogen. Wir haben alles (mit Ausnahme aller Kinder) von <Orders> genommen und in eine CSV-Datei eingefügt. Nun haben wir die CSV-Daten genommen und in die MySQL-DB eingefügt, um eine neue Bestellung zu erstellen.

Die neue Bestellung ist da, aber es fehlen Daten von <OrderDetails> Tags.

Ich habe versucht, alle <OrderDetails> Daten in ein Array zu setzen, aber ich bekomme nur die ersten zwei Tags, die in der ersten <Order> sind.

Idealerweise würde ich gerne alle <OrderDetails> Tags extrahieren und in eine andere CSV-Datei einfügen. Von dort werde ich es ziehen und es mit der gleichen Methode wie oben einfügen. Ich habe das versucht, aber die CSV ist aus, die Reihen stehen nicht Schlange und ich bekomme nur die ersten 2 Tags, nicht alle.

Ich bin offen für alles, so lassen Sie mich wissen ...

Antwort

3

Sie direkt auf die XML verarbeiten soll. Sie verlieren die Hierarchie der Daten, indem Sie versuchen, sie in eine CSV-Datei zu konvertieren.

Sie können SimpleXML verwenden, um alle Daten zu lesen. Es sieht so aus:

$xml = new SimpleXMLElement($content); 
foreach ($xml->Orders as $order) { 
    $order_id = $order->OrderId; 
    $order_status = $order->OrderStatus; 

    // Here we have a single order 
    // You can insert this order into the database 

    foreach ($order->OrderDetails as $order_details) { 
    $order_detail_id = $order_details->OrderDetailID; 
    $product_id = $order_details->ProductID; 

    // Here we have a single order detail that belongs to $order_id 
    // You can insert this order detail into the database 
    } 
} 
+0

Okay, das sieht gut aus, aber das Problem ist ich, ich bin nicht 100% bekommen es. Vielen Dank für Ihre Hilfe.Okay, dann habe ich es mit dieser Methode analysiert, die die Daten jedes Tags unter OrderDetails in $ order_details legt. Jetzt sehe ich für jedes Tag, wir setzen auch eine ID-Nummer oder jede ID-Nummer in $ order_details_id. Wie kann ich das erste OrderDetails OrderDetailID-Tag aufrufen, die Nummer überprüfen und ein paar Sachen machen, dann weiter zu den nächsten OrderDetails? Vielen Dank für die Hilfe und Entschuldigung, ich bin noch nicht ganz dabei. –

+0

Ich bearbeite meine Antwort, um einfacher zu sehen, wie Sie die Daten erhalten und in die Datenbank einfügen können. –

+0

Vielen Dank, das bringt mich auf den richtigen Weg. Kannst du mir zeigen, wie man die ersten OrderDetails und dann die zweite usw. aufruft, und bedenke, dass die erste Order zwei OrderDetails hat, die zweite Order eine. Deshalb muss ich jede OrderDetails nacheinander aufrufen, die OrderDetailsID prüfen und dann entsprechend einfügen und dann mit den nächsten OrderDetails fortfahren. –