Артём Мáлков

Как получить параметры из XML-файла на PHP?

16 ноя5 комм

Представим, что перед вами стоит задача – спарсить данные из XML-файла. Поскольку структура таких файлов может быть разной, то и трудности при написании своего скрипта также могут быть разными.

Сегодня на примере одного из таких файлов я покажу, как с помощью PHP получить тот или иной параметр.

Итак, перед нами файл price.xml с примерно такой структурой:

<offers>

	<offer id="102" available="true">
		<url>www.pandoge.com</url>
		<name>Коробка</name>
		<param name="Высота">60</param>
		<param name="Ширина">20</param>
		<param name="Цвет">Синий</param>
	</offer>

</offers>

Для теста получим его содержимое, а именно – данные из тега <url>:

$xml = simplexml_load_file("./price.xml");
	
foreach($xml->offer as $offer) {

	echo $offer->url;

}

Вроде бы все просто. А теперь попробуем получить значение, например, параметра «цвет» – и у большинства новичков здесь начинают возникать трудности.

А решается эта проблема довольно просто с помощью использования «XPath» – специального языка, созданного для запросов к элементам XML.

Реализация:

$xml = simplexml_load_file('./price.xml');
	
foreach($xml->offer as $offer) {

	echo $offer->xpath('param[@name="Цвет"]')[0];

}

В таком случае мы получаем значение «Синий», что нам и необходимо, а остальные параметры - получаются по аналогии.

Рекомендуем к просмотру
Замена ID категории в товарах YML-прайса ее названием + добавление цепочки родителей
Модули и скрипты
Находим наибольшее и наименьшее значение массива на PHP/JavaScript
Статьи и советы
Uppod – видеоплеер как во «ВКонтакте» на Flash
Модули и скрипты
5
комментариев
Форма комментирования этого поста скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
    • 0
    2
      •  Пользователь
    21 мар в 15:42

    Артем, здравствуйте !

    А не могли бы уточнить что за атрибуты нужно указать для получения переменной из тэга ? У меня схожая ситуация с примером в комментарии, не могу достать dateGenerated.... Спасибо заранее!

    <CONSOLIDATED_LIST xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='www' dateGenerated='2023-12-09T00:00:02.790Z'>

    • 2
    1067
      •  Команда Pandoge
    17 мар в 00:19

    Забыл упомянуть, хотя это тема отдельной статьи, что парсить можно не только файлы, но и строку.

    Для этого вместо функции simplexml_load_file вы используете simplexml_load_string:

    $xml = simplexml_load_string('
    
    	<offers>
    
    		<offer id="102" available="true">
    			<url>www.pandoge.com</url>
    			<name>Коробка</name>
    			<param name="Высота">60</param>
    			<param name="Ширина">20</param>
    			<param name="Цвет">Синий</param>
    		</offer>
    
    	</offers>
    
    ');
    • 3
    1
      •  Проверенный
    14 мар в 16:11

    Если вот такая структура, как получить все только url которые принадлежат enclosure? Весь интернет перерыл, только у вас что то похожее нашел. Ну и то методом тыка пытаюсь и не как не могу собрать эти урлы. Буду признателен если поможете.

    <item>
    <guid>https://lenta.ru/news/2022/03/13/kad/</guid>
    <author>Варвара Кошечкина</author>
    <title>
    В Чечне показали видео с Кадыровым и участниками операции на Украине
    </title>
    <link>https://lenta.ru/news/2022/03/13/kad/</link>
    <description>
    В сети появилось видео, на котором запечатлен глава Чечни Рамзан Кадыров в окружении бойцов, принимающих участие в специальной операции России на Украине. Соответствующий ролик был опубликован в Telegram-канале ЧГТРК «Грозный». На записи видно, как Кадыров общается с чеченскими военнослужащими.
    </description>
    <pubDate>Sun, 13 Mar 2022 16:56:26 +0300</pubDate>
    <enclosure url="https://icdn.lenta.ru/images/2022/03/13/15/20220313151619397/pic_f7181812ec0d81df138de5e17ab3daf5.jpg" type="image/jpeg" length="104928"/>
    <category>Россия</category>
    </item>
      • 1
      1067
        •  Команда Pandoge
      17 мар в 00:11

      Иван Сергеев, здравствуйте!

      Если enclosure точно один (если ноль - получим ошибку, больше - получим только первый):

      foreach($xml->offer as $offer) {
      
      	echo $offer->enclosure->attributes()->url;
      
      }

      Если количество неизвестно (получим все, если есть):

      foreach($xml->offer as $offer) {
      
      	foreach($offer->enclosure as $enclosure) {
      
      		echo $enclosure->attributes()->url.'<br />';
      
      	}
      
      }
      • 0
      2
        •  Пользователь
      20 мар в 13:45

      Артём Мáлков, Артем, добрый день !

      НЕ подскажите, что должно быть в attributes() ????

      у меня схожая ситуация, необходимо забирать данные из переменной dateGenerated внтури тэга...

      Спасибо заранее.

      <?xml version='1.0' encoding='UTF-8'?>

      <CONSOLIDATED_LIST xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='https://www.un.org/sc/resources/sc-sanctions.xsd' dateGenerated='2023-12-09T00:00:02.790Z'>

      <INDIVIDUALS>

Подняться наверх
«Pandoge» - помощник вебмастера