Работа с XML в PHP

Категория: PHP Комментариев: 2

Одной из лучших особенностей языка 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 всех элементов полученного массива.
И всё...

Автор: Кто-то   @   3 января 2009 Комментариев: 2
Метки : ,

Поблагодарить автора

Webmoney Z163628999150, R617151845974

Комментариев: 2

Комментарии
марта 13, 2009
19:14
#1 TerVer :

Спасибо!

Наконец-то нашел внятный минимум, а то у другиг так все просто, что не разобрать :)

Ноя 28, 2011
13:18
#2 Дмитрий :

"Content-length: " . strlen ($doc),

поясните пожалуйста: что за переменная $doc ???

оставить комментарий

Предыдущая запись
«
Следующая запись
»