2009-07-16 2 views
1

Мой шлюз отправляет (отправляет) мой сервер xml datafeed при совершении покупки. XML выглядит следующим образом:Как обрабатывать XML-файл с помощью 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; 

Как первый раз XML синтаксический переживания, я надеялся, что кто-то может показать мне, как я бы идти о поездке через и превратить это в массив PHP или что-то подобное, так что я могу затем вставьте данные, которые я хочу в таблицу mysql.

Самый простой способ сделать это?

ответ

2

Вы можете использовать builtin XML parser, руководство должно предоставить вам все, что вам нужно. Но, говоря по опыту, я бы рекомендовал учиться Xpath, так как это много быстрее и намного проще в использовании, чем что-либо еще, что вы можете получить с помощью PHP. Вы можете начать с [email protected], взгляните на nice examples in the specs и в конечном итоге используйте PHP functions.

Пример запроса для выбора идентификатора транзакции будет

$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

Я рекомендую вам также изучить XPath, но DOM раньше, поскольку он является основой XML =) –

6

вы можете использовать PHP XML-анализатор, как SimpleXML

+0

+1 для SimpleXML, превосходит DOM для простоты использования. – alastairs

3

Вы можете использовать следующий фрагмент кода с xml_parse_into_struct, чтобы получить XML в двух PHP массивы, один с данными, а другой с указателями, где учат тег появляется в массив значений:

$parser = xml_parser_create(); 

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

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

var_dump($values); 
var_dump($index) 

$ xml содержит данные XML. Для получения дополнительной информации см. Примеры на странице руководства, на которую я ссылаюсь.

1

Лучше всего использовать PHP XML Parser. IMO, очень полезно использовать PHP DOM, потому что на каждом языке (или около того) вы найдете эту библиотеку с теми же методами.

0

Синтаксический XML:
Если ваш сервер получает только XML (не в $ _POST [ 'xmlfeed']):

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

Не преобразовывать объект SimpleXML в массив. В любом случае, он очень похож на массив. Вы можете использовать foreach, и легко получить доступ к его элементам.
http://us2.php.net/manual/en/simplexml.examples-basic.php

P.S. Для больших XML-документов вместо XMLXeader() вместо SimpleXML.