Одной из лучших особенностей языка PHP состоит в удобном механизме работы с XML. В этой стаье я опишу как организовать взаимодействие PHP и XML.
Для тех, кто не в курсе:
XML (англ. eXtensible Markup Language — расширяемый язык разметки; произносится [экс-эм-э?л]) — рекомендованный Консорциумом Всемирной паутины язык разметки, фактически представляющий собой свод общих синтаксических правил. XML — текстовый формат, предназначенный для хранения структурированных данных (взамен существующих файлов баз данных), для обмена информацией между программами, а также для создания на его основе более специализированных языков разметки (например, XHTML), иногда называемых словарями. XML является упрощённым подмножеством языка SGML.
Для работы с XML в PHP используется класс SimpleXMLElement (), в качестве входного параметра которому передается, собственно, текст в XML. Этот текст можно либо загрузить из файла на хосте, либо с другого сайта коммандой file_get_contents (), например
$response = file_get_contents("http://site.ru/xml");
$xmldoc = new SimpleXMLElement($response);
Для отправки серверу (например xml.yandex.ru) запроса в формате XML нужно создать специальный контекст запроса, содержащий Ваш XML-запрос и указатель на то, что это именно XML-запрос:
$context = stream_context_create(array(
'http' => array(
'method'=>"POST",
'header'=>"Content-type: application/xmlrn" .
"Content-length: " . strlen($doc),
'content'=>"Ваш XML-запрос"
)
));
$response = file_get_contents('http://xmlsearch.yandex.ru/xmlsearch', true, $context);
$xmldoc = new SimpleXMLElement($response);
Теперь, когда мы получили необходимый для обработки XML-текст и создали из него класс SimpleXMLElement (), можно приступать к его обработке.
Если при получении от сервера XML произошла какая-то ошибка, то просмотреть ее можно в массиве $xmldoc->response->error:
$error = $xmldoc->response->error;
echo $error[0];
Теперь мы можем обращаться к данным в XML следующим образом:
$found_all = $xmldoc->response->found;где found — ключ <found>some data</found>
После выполнения этой конструкции в переменная $found_all примет значение «some data».
Если нам необходимо получить массив значений, то можно воспользоваться методом SimpleXMLElement->xpath (), в качестве входного параметра которому передается путь вложенности интересующих нас данных:
$found = $xmldoc->xpath("response/results/grouping/group/doc");
foreach ($found as $item) {
echo $item->title;
}
Например, данные в нашем XML представлены так:
<response date="20090103T075701"> <results> <grouping attr="d" mode="deep" groups-on-page="10" docs-in-group="1"> <group> <doc id="9-"> <relevance priority="phrase"/> <url>http://www.yandex.ru/</url> <domain>www.yandex.ru</domain> <title><hlword priority="strict">Яндекс</hlword></title> </doc> </group> <group> <doc id="9-"> <relevance priority="phrase"/> <url>http://www.ya.ru/</url> <domain>www.ya.ru</domain> <title><hlword priority="strict">Яндекс</hlword></title> </doc> </group> </grouping> </results> </response>
Значит xpath вернет нам массив, содержащий все <doc>...</doc>. Далее в цикле foreach мы выводим ключ title всех элементов полученного массива.
И всё...
|
|
Webmoney Z163628999150, R617151845974
|
"Content-length: " . strlen ($doc),
поясните пожалуйста: что за переменная $doc ???
19:14
Спасибо!
Наконец-то нашел внятный минимум, а то у другиг так все просто, что не разобрать