Как получить данные из XML, которые отправляются в мой сценарий через сообщение HTTP? - PullRequest
0 голосов
/ 12 марта 2009

Поставщик собирается послать мне немного xml через httppost на скрипт, который я собираюсь сделать. Сценарий, когда получает httppost, мне нужно каким-то образом получить данные из xml и поместить их в мою базу данных.

У меня есть опыт работы со всеми 3, PHP MYSQL и XML. Я знаю, как получить значения из XML с помощью E4X, но я не знаю, как получить значения из XML с помощью PHP (4.3.9).

скажем, httppost - это XML, который выглядит следующим образом:

<data>
<item sku="434322" price="15.00" color="blue" shape="round"/>
<item sku="434323" price="20.00" color="red" shape="square"/>
<item sku="434324" price="45.00" color="green" shape="triangle"/>
<item sku="434325" price="30.00" color="blue" shape="star"/>
</data>

Как я могу использовать PHP для циклического прохождения каждого узла и получения каждого значения атрибута?

Спасибо !!

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

Ответы [ 5 ]

1 голос
/ 30 июля 2009

Это то, как вы проходите через узлы XML с PHP 4.0

<?php
$dom=domxml_open_file('file.xml');
// Or from a string
$dom=domxml_open_mem($xmlString);

$root=$dom->document_element;

$items=$root->get_elements_by_tagname('item');

// Loop trough childNodes
foreach ($items as $item) {
    $sku=$item->get_attribute('sku');

            // Your work here
}

echo $dom->dump_mem();
// Or to a file
$dom->dump_file('filename.xml');
?>
0 голосов
/ 13 марта 2009

CSV, вероятно, будет проще. Вы можете использовать explode (), чтобы разбить строку (документ на http://us2.php.net/explode).

Например, вы можете разбить ввод на строки, а затем разбить каждую строку на запятые:

// split up lines
$lines = explode("\n", $_POST['data']);
$data = array();
foreach ($lines as $row) {
    // split a line on the commas
    $prop = explode(',', $row);

    // append an element to the array that contains 
    // the properties as an associative array
    $data[] = array('sku' => $prop[0],
                    'price' => $prop[1],
                    'color' => $prop[2],
                    'shape' => $prop[3]);

}

Здесь я предполагаю, что вы хотите преобразовать входные данные в массив элементов, каждый элемент формы:

array(4) {
  ["sku"] =>
  "434322",
  ["price"] =>
  "15.00",
  ["color"] => 
  "blue"
  ["shape"] =>
  "round"
}
0 голосов
/ 12 марта 2009

Вы можете использовать file_get_contents() для извлечения строки XML из запроса POST. Но я не совсем уверен, что "php://input" уже работает в PHP4.

$xmlData = file_get_contents("php://input");

В PHP4 есть расширение domxml для работы с XML. Но я бы настоятельно рекомендовал использовать PHP5 и расширение DOM .

0 голосов
/ 13 марта 2009

Если ваш поставщик может отправить его любым способом, почему бы не отправить его как:
Действительный код PHP, просто отправьте его в виде массива. Если скрипт Vendors работает как PHP сам по себе, это будет еще проще, поскольку они могут выводить действительный код PHP с помощью: var_export ().

Также вы можете попробовать использовать функции XML-разбора, которые можно найти в комментариях на этой странице: http://nl2.php.net/manual/en/function.xml-parse.php все они выглядят довольно хорошо.

0 голосов
/ 12 марта 2009

Для обработки данных CSV я использую str_getcsv ()

while (($data = str_getcsv() !== FALSE)
{do something useful with $data}

Для XML я рекомендую класс SimpleXML , а не анализатор XML. Simple не самый гибкий, но он прекрасно работает, если все, что вы делаете, это читаете некоторые данные и сохраняете их.

Если данные формы - это просто текстовая строка, вы бы

$ xml = simplexml_load_string ($ string)

А потом

foreach ($ xml-> children () как $ child)

{сделать что-нибудь интересное}

Или вы можете просто отбросить XML и выбросить его в массив с помощью xml_parse_into_struct

$ xmlparser = xml_parser_create ();

xml_parse_into_struct ($ XMLParser, $ XMLDATA, $ значения);

xml_parser_free ($ XMLParser);

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