Как мне обработать файл XML с помощью php? - PullRequest
1 голос
/ 16 июля 2009

Мой шлюз отправляет (отправляет) моему серверу поток данных xml при совершении покупки. 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.

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

Ответы [ 5 ]

6 голосов
/ 16 июля 2009

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

3 голосов
/ 16 июля 2009

Вы можете использовать следующий фрагмент с 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. Посмотрите примеры на странице руководства, на которую я ссылаюсь, для получения дополнительной информации.

2 голосов
/ 16 июля 2009

Вы можете использовать встроенный синтаксический анализатор XML 1002 *, руководство должно дать вам все, что вам нужно. Но, исходя из опыта, я бы действительно рекомендовал учить Xpath , поскольку он намного быстрее и намного проще в использовании, чем все, что вы можете получить с помощью PHP. Вы можете начать с ввести @ w3schools , взглянуть на хорошие примеры в спецификации и в конечном итоге использовать PHP-функции .

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

$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);
1 голос
/ 16 июля 2009

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

0 голосов
/ 22 июля 2009

Синтаксический анализ 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...