Як правильно читати теги з двокрапкою (<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, а можна зробити запис ще коротшим і більш зрозумiлим, наприклад звернення через властивість до класу $tem->{'g:id'}. Це те саме, що й звернення до звичайного класу.

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

463 0

Відгуки

Поки немає жодного відгуку. Станьте першим!
Тільки авторизовані користувачі можуть залишати відгуки Вхід

Схожі статті

Створити та завантажити CSV на PHP

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

Шаблони ImageCMS 4.10-4.12.1

Останні шаблони від ImageCMS 4.12, для завантаження потрібна авторизація.

Довге зберігання кошика в інтернет-магазині

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