Работа с Simple XML

Рейтинг: 0Ответов: 1Опубликовано: 13.04.2023

Всем привет! Помогите знающие люди:

Не могу добраться до узлов XML дереве. Вот пример XML-файла:

<?xml version="1.0" encoding="utf-8"?>
<Dictionary>
    <Item>
        <CFO_CODE>12345</CFO_CODE>
        <CFO_NAME>Предприятие_0</CFO_NAME>
        <TECH_NAME>TEST1</TECH_NAME>
    </Item>
    <Item>
        <CFO_CODE>7890</CFO_CODE>
        <CFO_NAME>Предприятие_1</CFO_NAME>
        <TECH_NAME>TEST2</TECH_NAME>
    </Item>
    <Item>
        <CFO_CODE>5689</CFO_CODE>
        <CFO_NAME>Предприятие_2</CFO_NAME>
        <TECH_NAME>TEST3</TECH_NAME>
    </Item>
</Dictionary>

Мне нужно собрать в 1 массив все значения узлов CFO_CODE.

Вот что есть на данный момент: Тестирую, используя Postman

Точка входа (первым вызывается метод updateDictionary):

public static function updateDictionary($params)
    {
        $content = file_get_contents('php://input');
        $xml = new \SimpleXMLElement($content);
        $items = $xml->xpath('/Dictionary/Item');
 
        self::addOrUpdateDictionaryCFO('cfo', $items);
        return'success';
    }
 
public static function addOrUpdateDictionaryCFO($iblockCode,  $data)
    {
        $iblockId = IblockHelper::getIblockIdByCode($iblockCode);
        foreach ($data as $dataItem) {
            $cfoCodes[] = $dataItem->CFO_CODE;
        }
 
        
    }

Проблема в том, что в $cfoCodes лежат не значения узлов, а объекты, а как добраться до самих значений - пока не знаю. Помогите пожалуйста.

Скриншот того, что лежит в $cfoCodes прикрепил. Скрин

Ответы

▲ 0

Как другой вариант вот:

$cfoCodeValues = [];
$dDoc = new DOMDocument;
$dDoc->load('data.xml');
// $dDoc->loadXML($content);
$dd = $dDoc->getElementsByTagName('Dictionary');
for ($i = 0; $i < $dd->length; $i++) {
    $cn = $dd->item($i)->childNodes;
    for ($j = 0; $j < $cn->length; $j++) {
        $cnk = $cn->item($j)->childNodes;
        for ($k = 0; $k < $cnk->length; $k++) {
            if ($cnk->item($k)->nodeName != "CFO_CODE") continue;
            $cfoCodeValues[] = $cnk->item($k)->nodeValue;
        }
    }
}
echo "<pre>"; print_r($cfoCodeValues); echo "</pre>\n";