simplexml_load_string не создает массив атрибутов, если узел XML является узлом значения

75
4

Я загружаю XML-строку с помощью simplexml_load_string и если узел не имеет дочерних узлов, принадлежащих ему, атрибуты этого узла, похоже, не правильно отображаются в массиве. Есть ли способ обойти это? См. Разделы CUSTOM_PROPERTY ниже:

Предположим, у меня есть следующий XML:

<WEBSITE NAME="www.example.co.uk">
<CATEGORY ID="35702" NAME="CatName" FILE_NAME="" LONG_DESC="" SHORT_DESC="">
<CUSTOM>
<CUSTOM_PROPERTY NAME="CATTYPE_INDEX">6</CUSTOM_PROPERTY>
<CUSTOM_PROPERTY NAME="TEMPLATE_ID">0</CUSTOM_PROPERTY>
<CUSTOM_PROPERTY NAME="DISPLAY_LIMIT">10</CUSTOM_PROPERTY>
<CUSTOM_PROPERTY NAME="HIDE_ON_MENU">0</CUSTOM_PROPERTY>
<CUSTOM_PROPERTY NAME="CAT_COLOUR">#01b2a8</CUSTOM_PROPERTY>
</CUSTOM>
</CATEGORY>

Когда я использую следующий код:

$Xml = simplexml_load_string($Str);
print_r($Xml);

Он возвращает это:

SimpleXMLElement Object
(
[@attributes] => Array
(
[NAME] => www.example.co.uk
)

[CATEGORY] => Array
(
[0] => SimpleXMLElement Object
(
[@attributes] => Array
(
[ID] => 35702
[NAME] => CatName
[FILE_NAME] =>
[LONG_DESC] =>
[SHORT_DESC] =>
)

[CUSTOM] => SimpleXMLElement Object
(
[CUSTOM_PROPERTY] => Array
(
[0] => 6
[1] => 0
[2] => 10
[3] => 0
[4] => #01b2a8
)

)

)
)
)

CUSTOM_PROPERTY должен иметь атрибут NAME но это не так.

спросил(а) 2021-01-28T01:12:44+03:00 3 месяца, 1 неделя назад
1
Решение
98

Ваши атрибуты есть, но не отображаются print_r(). Помните, что print_r() не является надежным способом просмотра всей структуры SimpleXML.

Пример:

демонстрация

$obj = simplexml_load_string($xml);

foreach($obj->CATEGORY->CUSTOM->CUSTOM_PROPERTY as $custom_property)
{
echo $custom_property->attributes()->NAME . "\n";
}

Выходы

CATTYPE_INDEX
TEMPLATE_ID
DISPLAY_LIMIT
HIDE_ON_MENU
CAT_COLOUR

ответил(а) 2021-01-28T01:12:44+03:00 3 месяца, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема