Я пытаюсь решить, как итерации, хотя возвращенный объект 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; }