Как получить значение тега из SimpleXMLElement?

119
20 сентября 2021, 23:50

Как получить значение тега <category> и записать его в масив?

Проблема в том, что никак не могу получить содержимое тега <category> (Лампы бытовые), любые попытки, кроме echo, возвращают object(SimpleXMLElement).

<?php
$file = <<<XML
<yml_catalog date="2019-10-18 16:00">
    <shop>
        <categories>
            <category id="41" parentId="38">Лампы бытовые</category>
            <category id="42" parentId="41">A60</category>
        </categories>
    </shop>
</yml_catalog>
XML;
$value = new SimpleXMLElement($file);
$categories = [];
foreach ($value->shop->categories->category as $c) {
    $categories[(int)$c->attributes()['id']] =
    [
        'id' => (int)$c->attributes()['id'],
        'parentId' => (int)$c->attributes()['parentId'],
        'name' => $c[0]                                   // object(SimpleXMLElement)
    ];
    echo '<pre>';
    var_dump($categories[(int)$c->attributes()['id']]);
    echo '</pre>';
    echo '<hr>';
}

Результат var_dump в цикле

array(3) {
["id"]=>
int(41)
["parentId"]=>
int(38)
["name"]=>
object(SimpleXMLElement)#6 (2) {
    ["@attributes"]=>
    array(2) {
    ["id"]=>
    string(2) "41"
    ["parentId"]=>
    string(2) "38"
    }
    [0]=>
    string(25) "Лампы бытовые"
}
}
Answer 1

Для получения строкового значения объекта SimpleXMLElement надо кастануть этот объект в тип string (это собственно неявно делается при вызове echo, а вам надо это сделать явно):

'name' = (string) $c[0],
// или с небольшим оверхедом
'name' = strval($c[0]), 
Answer 2

Думаю можете сделать так:

     <?php
     $file = '<yml_catalog date="2019-10-18 16:00">
        <shop>
            <categories>
                <category id="41" parentId="38">Лампы бытовые</category>
                <category id="42" parentId="41">A60</category>
            </categories>
        </shop>
    </yml_catalog>';
    $value = new SimpleXMLElement( $file );
    $categories = [];
    $data = [];
    foreach ( $value->shop->categories->category as $key => $c ) {
        $data[ 'id' ] = ( int )$c->attributes()[ 'id' ];
        $data[ 'parentId' ] = ( int )$c->attributes()[ 'parentId' ];
        $data[ 'name' ] = ( string )$c[ 0 ];
        array_push( $categories, $data );
    }
    print_r( $categories );
/*
Результат
(
    [0] => Array
        (
            [id] =>  41
            [parentId] =>  38
            [name] =>  Лампы бытовые
        )
    [1] =>  Array
        (
            [id] =>  42
            [parentId] =>  41
            [name] =>  A60
        )
)

*/
Answer 3

Не совсем ясен вопрос. Содержимое внутри тега?

'name' => $c[0].__toString() // SimpleXMLElement::__toString — Возвращает содержимое строки

https://www.php.net/manual/ru/simplexmlelement.tostring.php

READ ALSO
Как подключать стили в php?

Как подключать стили в php?

Я новичок в phpСоздал папку в которой 2 файла - index

96
Не работает запрос UPDATE php

Не работает запрос UPDATE php

Не работает запрос UPDATE, данные не изменяютсяПеременные существуют, через echo проверял, подключение к базе данных тоже, другие запросы выполняются

102
Как бороться с Segmentation fault?

Как бороться с Segmentation fault?

Выполняю скрипт примерно такого содержания:

272
Не загружается файл на сервер PHP

Не загружается файл на сервер PHP

Эта загрузка работает стабильно на локальном сервере, но на удаленном нетВ форме прописан enctype="multipart/form-data

131