Подтвердить что ты не робот

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

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

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

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

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

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

Здесь образец возвращаемого объекта SimpleXML:

 [body] => SimpleXMLElement Object
        (
            [QueryWithAttributesResult] => SimpleXMLElement Object
                (
                    [Item] => Array
                        (
                            [0] => SimpleXMLElement Object
                                (
                                    [Name] => message12413344443260
                                    [Attribute] => Array
                                        (
                                            [0] => SimpleXMLElement Object
                                                (
                                                    [Name] => active
                                                    [Value] => 1
                                                )

                                            [1] => SimpleXMLElement Object
                                                (
                                                    [Name] => user
                                                    [Value] => john
                                                )

                                            [2] => SimpleXMLElement Object
                                                (
                                                    [Name] => message
                                                    [Value] => This is a message.
                                                )

                                            [3] => SimpleXMLElement Object
                                                (
                                                    [Name] => time
                                                    [Value] => 1241334444
                                                )

                                            [4] => SimpleXMLElement Object
                                                (
                                                    [Name] => id
                                                    [Value] => 12413344443260
                                                )

                                            [5] => SimpleXMLElement Object
                                                (
                                                    [Name] => ip
                                                    [Value] => 10.10.10.1
                                                )

                                        )

                                )

                            [1] => SimpleXMLElement Object
                                (
                                    [Name] => message12413346907303
                                    [Attribute] => Array
                                        (
                                            [0] => SimpleXMLElement Object
                                                (
                                                    [Name] => active
                                                    [Value] => 1
                                                )

                                            [1] => SimpleXMLElement Object
                                                (
                                                    [Name] => user
                                                    [Value] => fred
                                                )

                                            [2] => SimpleXMLElement Object
                                                (
                                                    [Name] => message
                                                    [Value] => This is another message
                                                )

                                            [3] => SimpleXMLElement Object
                                                (
                                                    [Name] => time
                                                    [Value] => 1241334690
                                                )

                                            [4] => SimpleXMLElement Object
                                                (
                                                    [Name] => id
                                                    [Value] => 12413346907303
                                                )

                                            [5] => SimpleXMLElement Object
                                                (
                                                    [Name] => ip
                                                    [Value] => 10.10.10.2
                                                )

                                        )

                                )

                        )

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

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

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

4b9b3361

Ответ 1

Вы можете использовать объект 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.

Ответ 2

get_object_vars($simpleXMLElement);

Ответ 3

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

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

Ответ 4

В случае ответов 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).

Ответ 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;
}