Я пытаюсь решить, как итерации, хотя возвращенный объект 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, поэтому прошу прощения, если мои вопросы не являются достаточно конкретными.
Вы можете использовать объект 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; }