Как правильно читать теги с двоеточием (<p:id>) в google_merchant.xml в PHP

Считать простым способом тег <p:id> в xml не получится. Следует проанализировать xml на описание пространства xmlns:g="http://base.google.com/ns/1.0". Если такая строка присутствует, то можно воспользоваться xpath, а если нет, то есть способ прочитать такой тег проще.

Пример xml:

<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
  <channel>
    <title>Пример магазина</title>
    <link>https://example.com</link>
    <description>Товарный фид</description>

    <item>
      <g:id>12345</g:id>
      <g:title>Товар 1</g:title>
      <g:price>199.00 UAH</g:price>
    </item>

    <item>
      <g:id>12346</g:id>
      <g:title>Товар 2</g:title>
      <g:price>299.00 UAH</g:price>
    </item>
  </channel>
</rss>

Есть xmlns:g="http://base.google.com/ns/1.0", то используем xpath:

<?php
$xml = simplexml_load_string($xmlString);
// Регистрируем пространство имён для работы через xpath
$xml->registerXPathNamespace('g', 'http://base.google.com/ns/1.0');

// Выносим item в переменную
$items = $xml->xpath('//item');
$result = [];

foreach ($items as $item) {
    $id    = (string) $item->xpath('g:id')[0];
    $title = (string) $item->xpath('g:title')[0];
    $price = (string) $item->xpath('g:price')[0];

    $result[] = [
        'id'    => $id,
        'title' => $title,
        'price' => $price,
    ];
}
var_dump($result);

Конструкция для обращения к нужному тегу определяется так "$item->xpath('g:id')[0]".

Когда нет xmlns:g="http://base.google.com/ns/1.0":

<?php
$xml = simplexml_load_string($xmlString);

$result = [];
foreach ($xml->channel->item as $item) {
    $result[] = [
        'id'    = (string) $item->{'g:id'};
        'title' = (string) $item->{'g:title'};
        'price' = (string) $item->{'g:price'};
    ];
    // ИЛИ
    // $result['id'] = (string)$item->children('g', true)->id;
}
var_dump($result);

Можно использовать конструкцию $item->children('g', true)->id, а можно сделать еще короче и более читаемо, например обращение через свойство к классу $item->{'g:id'}. Это то же самое, что и обращение к обычному классу.

<?php
$obj = new stdClass();
$obj->{'g:field'} = 'значение';
var_dump($obj->{'g:field'});

462 0

Комментарии

Пока нет ни одного отзыва. Оставьте отзыв первым
Только авторизованные пользователи могут оставлять комментарии Вход

Похожие статьи

Создать и скачать CSV на PHP

Рассмотрим возможность быстрого создания CSV файла с автоматическим скачиванием файла. Рассмотрим формирование, разделители и header для возможности скачать файл.

Долгое хранение корзины в интернет-магазине

Рассмотрим варианты популярные варианты хранения товаров в корзине в интернет-магазине. Обозначим плюсы и минусы таких хранений. Рассмотрим варианты долгосрочного хранения корзины.