2009-07-16 77 views
1

我的网关在购买时发送(发布)我的服务器的xml数据传输。该XML看起来是这样的:如何使用php处理XML文件?

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

用于选择交易ID查询示例将

$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 =的基础) – 2009-07-16 14:06:12

6

您可以使用PHP的XML解析器,像SimpleXML

+0

SimpleXML的+1,击败DOM易于使用的手。 – alastairs 2009-07-16 14:07:22

3

您可以使用下面的代码片段,其中xml_parse_into_struct让你的XML为两个PHP数组,一个与数据,另一个在何处教标签出现在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包含XML数据。查看我链接到的手册页中的示例以获取更多信息。

1

最好是使用PHP的XML解析器。 国际海事组织,最好是使用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文档,使用XMLReader()而不是SimpleXML。