2009-07-16 8 views
1

Mein Gateway sendet (postet) einen XML-Datafeed an meinen Server, wenn ein Kauf getätigt wird. Die XML sieht ungefähr so ​​aus:Wie verarbeite ich eine XML-Datei mit PHP?

<?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; 

Als ein erstes Mal erlebt XML-Parsing, ich hatte gehofft, dass jemand mir zeigen konnte, wie ich über das Gehen durch gehen würde und drehen, um dieses in einen PHP-Array oder so ähnlich, so kann ich Fügen Sie dann die gewünschten Daten in eine MySQL-Tabelle ein.

Was ist der einfachste Weg, dies zu tun?

Antwort

2

Sie können das builtin XML parser verwenden, das Handbuch sollte Ihnen alles geben, was Sie brauchen. Aber aus Erfahrung zu sprechen, würde ich wirklich empfehlen, Xpath zu lernen, da es viel schneller ist und viel einfacher zu verwenden als alles andere, was Sie mit PHP bekommen können. Sie könnten mit der [email protected] beginnen, werfen Sie einen Blick auf die nice examples in the specs und verwenden Sie schließlich die PHP functions.

Eine Beispielabfrage für die Transaktions-ID Auswahl wäre

$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); 
+0

Ich empfehle Ihnen, XPath zu lernen, aber DOM vorher, wie es die Grundlage von XML ist =) –

6

können Sie einen PHP XML-Parser verwenden, wie SimpleXML

+0

+1 für SimpleXML, schlägt das DOM für Benutzerfreundlichkeit Hands-Down. – alastairs

3

Sie den folgenden Ausschnitt mit xml_parse_into_struct verwenden können, um XML in zwei PHP-Arrays zu erhalten, eine mit den Daten und zum anderem mit Zeigern auf den Teach-Tag in dem erscheint Werte Array:

$parser = xml_parser_create(); 

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

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

var_dump($values); 
var_dump($index) 

$ xml enthält die XML-Daten. Weitere Informationen finden Sie in den Beispielen in der Handbuchseite, auf die ich verlinke.

1

Am besten ist ein PHP XML Parser zu verwenden. IMO, ist am besten zu verwenden PHP DOM weil in jeder Sprache (oder so), finden Sie diese Bibliothek, mit den gleichen Methoden.

0

Parsen von XML:
Wenn der Server nur die XML empfängt (nicht in $ _POST [ 'xmlfeed']):

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

Sie das SimpleXML Objekt in ein Array nicht konvertieren. Es funktioniert auf jeden Fall wie ein Array. Sie können foreach verwenden und auf seine Elemente zugreifen.
http://us2.php.net/manual/en/simplexml.examples-basic.php

P.S. Verwenden Sie für große XML-Dokumente XMLReader() anstelle von SimpleXML.

Verwandte Themen