PHP получает значения из массива SimpleXMLElement

У меня есть это:

[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)