Зацикливание через объект SimpleXML или превращение всего объекта в массив

Я пытаюсь решить, как итерации, хотя возвращенный объект SimpleXML.

Я использую набор инструментов под названием Tarzan AWS , который подключается к Amazon Web Services (SimpleDB, S3, EC2 и т. Д.). Я специально использую SimpleDB.

Я могу поместить данные в службу Amazon SimpleDB, и я могу вернуть их. Я просто не знаю, как обрабатывать возвращаемый объект SimpleXML.

В документации Тарзана AWS сказано следующее:

Посмотрите на ответ для навигации по заголовкам и телу ответа. Обратите внимание, что это объект, а не массив, и тело является объектом SimpleXML.

Вот пример возвращаемого объекта SimpleXML:

  [body] => Объект SimpleXMLElement
         (
             [QueryWithAttributesResult] => Объект SimpleXMLElement
                 (
                     [Item] => Array
                         (
                             [0] => Объект SimpleXMLElement
                                 (
                                     [Name] => message12413344443260
                                     [Атрибут] => Массив
                                         (
                                             [0] => Объект SimpleXMLElement
                                                 (
                                                     [Name] => active
                                                     [Значение] => 1
                                                 )

                                             [1] => Объект SimpleXMLElement
                                                 (
                                                     [Name] => пользователь
                                                     [Значение] => john
                                                 )

                                             [2] => Объект SimpleXMLElement
                                                 (
                                                     [Name] => сообщение
                                                     [Значение] => Это сообщение.
                                                 )

                                             [3] => Объект SimpleXMLElement
                                                 (
                                                     [Имя] => время
                                                     [Значение] => 1241334444
                                                 )

                                             [4] => Объект SimpleXMLElement
                                                 (
                                                     [Name] => id
                                                     [Значение] => 12413344443260
                                                 )

                                             [5] => Объект SimpleXMLElement
                                                 (
                                                     [Name] => ip
                                                     [Значение] => 10.10.10.1
                                                 )

                                         )

                                 )

                             [1] => Объект SimpleXMLElement
                                 (
                                     [Name] => message12413346907303
                                     [Атрибут] => Массив
                                         (
                                             [0] => Объект SimpleXMLElement
                                                 (
                                                     [Name] => active
                                                     [Значение] => 1
                                                 )

                                             [1] => Объект SimpleXMLElement
                                                 (
                                                     [Name] => пользователь
                                                     [Значение] => fred
                                                 )

                                             [2] => Объект SimpleXMLElement
                                                 (
                                                     [Name] => сообщение
                                                     [Value] => Это другое сообщение
                                                 )

                                             [3] => Объект SimpleXMLElement
                                                 (
                                                     [Имя] => время
                                                     [Значение] => 1241334690
                                                 )

                                             [4] => Объект SimpleXMLElement
                                                 (
                                                     [Name] => id
                                                     [Значение] => 12413346907303
                                                 )

                                             [5] => Объект SimpleXMLElement
                                                 (
                                                     [Name] => ip
                                                     [Значение] => 10.10.10.2
                                                 )

                                         )

                                 )

                         )

Итак, какой код мне нужен для прохождения каждого из объектов? Я хотел бы пройти через каждый из них и обрабатывать его как возвращаемый запрос mySQL. Например, я могу запросить SimpleDB, а затем прокрутить через SimpleXML, чтобы я мог отображать результаты на странице.

В качестве альтернативы, как вы превращаете весь shebang в массив?

Я новичок в SimpleXML, поэтому прошу прощения, если мои вопросы не являются достаточно конкретными.

Solutions Collecting From Web of "Зацикливание через объект SimpleXML или превращение всего объекта в массив"

Вы можете использовать объект SimpleXML (или его свойства) в цикле foreach . Если вы хотите перебирать все «записи», что-то вроде этого можно использовать для доступа и отображения данных:

 //Loop through all the members of the Item array //(essentially your two database rows). foreach($SimpleXML->body->QueryWithAttributesResult->Item as $Item){ //Now you can access the 'row' data using $Item in this case //two elements, a name and an array of key/value pairs echo $Item->Name; //Loop through the attribute array to access the 'fields'. foreach($Item->Attribute as $Attribute){ //Each attribute has two elements, name and value. echo $Attribute->Name . ": " . $Attribute->Value; } } 

Обратите внимание, что $ Item будет объектом SimpleXML, как и $ Attribute, поэтому им нужно ссылаться как объекты, а не массивы.

В то время как приведенный выше примерный пример перебирает массивы в объекте SimpleXML ($ SimpleXML-> body-> QueryWithAttributesResult-> Item), вы также можете прокручивать объект SimpleXML (например, $ SimpleXML-> body-> QueryWithAttributesResult-> Item [ 0]), и это даст вам каждый из свойств объекта.

Каждый дочерний элемент объекта SimpleXML является объектом XML. Если XML-объект (тег) не уникален, то элемент представляет собой просто массив объектов SimpleXML, представляющих каждый объект.

Если вы хотите, это должно создать более общий массив строк / полей из вашего объекта SimpleXML (или закрыть вас):

 foreach($SimpleXML->body->QueryWithAttributesResult->Item as $Item){ foreach($Item->Attribute as $Attribute){ $rows[$Item->Name][$Attribute->Name] = $Attribute->Value; } } //Now you have an array that looks like: $rows['message12413344443260']['active'] = 1; $rows['message12413344443260']['user'] = 'john'; //etc. 
 get_object_vars($simpleXMLElement); 

одно небольшое дополнение для исправления PHP 5.2.

 $response_array = json_decode(json_encode($response),true); 

В случае ответов XML, которые НЕ содержат разделы CDATA (например, Amazon's / Tarzan's), вы можете использовать следующее, предполагая, что у вас есть PHP 5.2 или новее.

 // Get a SimpleXML response back from Tarzan $s3 = new AmazonS3(); $response = $s3->list_buckets(); // Convert SimpleXML to Array in PHP 5.2. $response_array = json_decode(json_encode($response)); 

Это будет стандартная утилита, доступная всем объектам следующей крупной версии Tarzan (CloudFusion 2.5).

Это сработало:

 // $result is a Simple XML object $result = convertSimpleXMLToArray($result); function convertSimpleXMLToArray($xml) { if(class_basename($xml) == 'SimpleXMLElement') { $xml = get_object_vars($xml); foreach($xml as $key => $value) { if(class_basename($value) == 'SimpleXMLElement') $xml[$key] = convertSimpleXMLToArray($value); } } return $xml; }