tags:

views:

126

answers:

5

Hi there,

My gateway sends(posts) my server an xml datafeed when a purchase is made. The XML looks something like this:

 <?xml version='1.0' standalone='yes'?>
 <foxydata>
<datafeed_version>XML FoxyCart Version 0.6</datafeed_version>
<transactions>
 <transaction>
  <id>616</id>
  <transaction_date>2007-05-04 20:53:57</transaction_date>
  <customer_id>122</customer_id>
  <customer_first_name>Dirk</customer_first_name>
  <customer_last_name>Gently</customer_last_name>
  <shipping_total>4.38</shipping_total>
  <order_total>24.38</order_total>
  <order_total>24.38</order_total>
                 <customer_password>1aab23051b24582c5dc8e23fc595d505</customer_password>
  <custom_fields>
   <custom_field>
    <custom_field_name>My_Cool_Text</custom_field_name>
    <custom_field_value>Value123</custom_field_value>
   </custom_field>
  </custom_fields>
  <transaction_details>
   <transaction_detail>
    <product_name>foo</product_name>
    <product_price>20.00</product_price>
    <product_quantity>1</product_quantity>
    <product_weight>0.10</product_weight>
    <product_code></product_code>
    <subscription_frequency>1m</subscription_frequency>
    <subscription_startdate>2007-07-07</subscription_startdate>
    <next_transaction_date>2007-08-07</next_transaction_date>
    <shipto>John Doe</shipto>
    <category_description>Default for all products</category_description>
    <category_code>DEFAULT</category_code>
    <product_delivery_type>shipped</product_delivery_type>
    <transaction_detail_options>
     <transaction_detail_option>
      <product_option_name>color</product_option_name>
      <product_option_value>blue</product_option_value>
      <price_mod></price_mod>
      <weight_mod></weight_mod>
     </transaction_detail_option>
    </transaction_detail_options>
   </transaction_detail>
  </transaction_details>
  <shipto_addresses>
   <shipto_address>
    <address_name>John Doe</address_name>
    <shipto_first_name>John</shipto_first_name>
    <shipto_last_name>Doe</shipto_last_name>
    <shipto_address1>2345 Some Address</shipto_address1>
    <shipto_address2></shipto_address2>
    <shipto_city>Some City</shipto_city>
    <shipto_state>TN</shipto_state>
    <shipto_postal_code>37013</shipto_postal_code>
    <shipto_country>US</shipto_country>
    <shipto_shipping_service_description>DHL: Next Afternoon</shipto_shipping_service_description>
    <shipto_subtotal>52.15</shipto_subtotal>
    <shipto_tax_total>6.31</shipto_tax_total>
    <shipto_shipping_total>15.76</shipto_shipping_total>
    <shipto_total>74.22</shipto_total>
    <shipto_custom_fields>
     <shipto_custom_field>
      <shipto_custom_field_name>My_Custom_Info</shipto_custom_field_name>
      <shipto_custom_field_value>john's stuff</shipto_custom_field_value>
     </shipto_custom_field>
     <shipto_custom_field>
      <shipto_custom_field_name>More_Custom_Info</shipto_custom_field_name>
      <shipto_custom_field_value>more of john's stuff</shipto_custom_field_value>
     </shipto_custom_field>
    </shipto_custom_fields>
   </shipto_address>
  </shipto_addresses>
 </transaction>
</transactions>
</foxydata>
XML;

As a first time XML parsing experiencing, I was hoping somebody could show me how I would go about going through and turning this into a php array or something like that so I can then insert the data I want into a mysql table.

Whats the easiest way to go about doing this?

+6  A: 

you can use a PHP XML parser, like SimpleXML

ghostdog74
+1 for SimpleXML, beats the DOM for ease-of-use hands down.
alastairs
+3  A: 

You can use the following snippet with xml_parse_into_struct to get your XML into two PHP arrays, one with the data and another with pointers to where teach tag appears in the values array:

$parser = xml_parser_create();

$values = array();
$index = array();

xml_parse_into_struct  ($parser, $xml, &$values, &$index);

var_dump($values);
var_dump($index)

$xml contains the XML data. Check the examples in the manual page I link to for further information.

Vinko Vrsalovic
+2  A: 

You can use the builtin XML parser, the manual should give you everything you need. But speaking from experience, I would really recommend learning Xpath, since it is much faster and much easier to use then anything else you can get with PHP. You could start with the introduction@w3schools, have a look at the nice examples in the specs and eventually use the PHP functions.

A sample query for selecting the transaction id would be

$document = new DOMDocument();
$document->load('YourFile.xml');
$xpath = new DOMXPath($document);

# Query id
$ids = $xpath->query('/transactions/transaction/id/text()');
# $ids is a DOMNodeList object
assert($ids->length === 1);
$id = $ids->item(0);

# Query date
$dates = $xpath->query('/transactions/transaction/transaction_date/text()');
# $dates is a DOMNodeList object
assert($dates->length === 1);
$id = $dates->item(0);
soulmerge
I recommend you to learn XPath too, but DOM before, as it is the basis of XML =)
Clement Herreman
+1  A: 

Best is to use a PHP XML Parser. IMO, very best is to use PHP DOM because in every language (or so), you'll find this library, with the same methods.

Clement Herreman
A: 

Parsing XML:
If your server receives just the XML ( not in $_POST['xmlfeed']) :

$xml = file_get_contents("php://input");  
$data = simplexml_load_string ($xml);

Don't convert the SimpleXML object into an array. It works pretty much like an array anyway. You can use foreach and it's easy to access its elements.
http://us2.php.net/manual/en/simplexml.examples-basic.php

P.S. For large XML documents use XMLReader() instead of SimpleXML .

Alex L