Цикл по объекту SimpleXML или превращение всего объекта в массив - PullRequest
17 голосов
/ 16 мая 2009

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

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

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

Документация Tarzan 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, чтобы отобразить результаты на странице.

В качестве альтернативы, как превратить весь Шебанг в массив?

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

Ответы [ 6 ]

17 голосов
/ 16 мая 2009

Вы можете использовать объект 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.
8 голосов
/ 10 февраля 2012
get_object_vars($simpleXMLElement);
5 голосов
/ 05 апреля 2010

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

$response_array = json_decode(json_encode($response),true);
2 голосов
/ 19 августа 2009

В случае ответов XML, которые НЕ содержат разделов CDATA (например, Amazon / Tarzan), вы можете использовать следующее, если у вас 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).

0 голосов
/ 26 февраля 2019

Почти все примеры, которые я нашел, относятся к конкретному примеру, где вы уже знаете узлы. Следующая функция преобразует элемент SimpleXMLElement в массив, не зная имен узлов, а также имеет ли они дочерние элементы или нет. Также будет хорошо работать с разделами CDATA.

function parseXML(SimpleXMLElement $xml) : array
{
    $array = [];

    foreach(iterator_to_array($xml, TRUE) as $key => $value)
        $array[$key] = ($value->count() > 1) ? parseXML($value) : (string)$value;

    return $array;
}
0 голосов
/ 28 августа 2017

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

// $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;
}
...