У меня есть это:
[1]=> object(SimpleXMLElement)#6 (1) { ["@attributes"]=> array(14) { ["name"]=> string(5) "MySQL" ["acknowledged"]=> string(1) "1" ["comments"]=> string(1) "1" ["current_check_attempt"]=> string(1) "1" ["downtime"]=> string(1) "0" ["last_check"]=> string(19) "2010-05-01 17:57:00" ["markdown_filter"]=> string(1) "0" ["max_check_attempts"]=> string(1) "3" ["output"]=> string(42) "CRITICAL - Socket timeout after 10 seconds" ["perfdata_available"]=> string(1) "1" ["service_object_id"]=> string(3) "580" ["state"]=> string(8) "critical" ["state_duration"]=> string(6) "759439" ["unhandled"]=> string(1) "0" } }
(Я использовал var_dump ($ child) для создания этого)
Как получить атрибут 'name' оттуда в виде строки?
Вот мой код:
$xml = simplexml_load_string($results); foreach($xml->data->list as $child) { var_dump($child); echo $child->getName() . ": " . $child->name . "<br />"; }
С помощью SimpleXML вы можете получить:
$element->subElement
$element['attribute']
Итак, здесь, я бы сказал, вам придется использовать:
echo $child['name'];
В качестве справочной информации и для нескольких примеров см. Раздел « Основное использование » руководства simplexml.
Пример №6 должен быть интересным, об атрибутах.
Хотя вы можете сделать:
echo $child['name'];
чтобы увидеть значение, вы должны заметить, что $child['name']
– это объект, а не строка. Повторяя это, он переводит его в строку, поэтому он работает в этой ситуации. Но если вы его где-то храните, лучше просто нанести его на строку:
$name = (string) $child['name'];
Вид грязный, но я использовал это успешно
foreach($xml->data->children() as $child) { //var_dump($child); foreach ($child->attributes() as $a => $b) { echo $a . '=' . $b . '<br />'; } }
Не уверен, почему, но OpsView API возвращает двумерный массив вместо того, чтобы иметь только одно значение для узла XML 🙁
echo $child['name'];
работает и намного элегантнее, спасибо.
У меня была аналогичная проблема, мне нужно было получить строку из моего SimpleXMLElement, я не мог найти имя, чтобы позвонить ему. Найденное решение, используя (string), чтобы получить текст строки:
foreach ($lines as $line) { array_push($result, new line(**(string)**$line)); } array 0 => object(line)[190] private '_line' => object(SimpleXMLElement)[128] public '@attributes' => array ... string ' ' (length=1) 1 => object(line)[191] private '_line' => object(SimpleXMLElement)[131] public '@attributes' => array ... string ' ' (length=1) 2 => object(line)[192] private '_line' => object(SimpleXMLElement)[132] public '@attributes' => array ... string ' ~54**** INVOICE ****' (length=27)