Достать значение из SimpleXMLElement Object для JSON'a

Тема в разделе "PHP", создана пользователем Albert22, 12 июл 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Albert22

    Albert22

    Регистр.:
    30 мар 2008
    Сообщения:
    270
    Симпатии:
    10
    Всем привет
    Имеется вот такого рода XML-файл:
    Код:
    <track>
        <id>3189830</id>
        <name>Empty Sky</name>
        <duration>509000</duration>
        <artist>
            <name>Elton John</name>
        </artist>
            <album position="1">
            <artist>Elton John</artist>
            <title>Empty Sky</title>
            <mbid>22f9fe0b-9455-4816-9849-d50c0b5f1b09</mbid>
            <url>/music/Elton+John/Empty+Sky</url>                    
        </album>
    </track>
    Обрабатывается следующим образом:
    Код:
    $xml = @simplexml_load_file($file);
    $return=array(
    'status'=>1,
    ...
    'album_title'=>$xml->track[0]->album[0]->title,
    'album_url'=>$xml->track[0]->album[0]->url
    );
    echo json_encode($return);
    И в результате выдаётся вот такой JSON:
    Код:
    {"status":1,...,"album_title":{"0":"Empty Sky"},"album_url":{"0":"\/music\/Elton+John\/Empty+Sky"}}
    Однако, в результате вставки на страницу информации из album_url и album_title отображается
    Подскажите, что где изменить или как вытаскивать чтобы получить строку? Пробовал комбинировать, менять — не получилось, нужно знать конкретно.
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    прежде всего можно print_r($xml) и посмотреть структуру отпарсенного файла.
    Это означает, что ты передаёшь на печать объект.

    Есть готовые решения для конвертации
    http://www.ibm.com/developerworks/ru/library/x-xml2jsonphp/
     
  3. murlo

    murlo Создатель

    Регистр.:
    8 июн 2006
    Сообщения:
    34
    Симпатии:
    33
    PHP:
    <?php
    $string 
    '<track>
      <id>3189830</id>
      <name>Empty Sky</name>
      <duration>509000</duration>
      <artist>
        <name>Elton John</name>
      </artist>
      <album position="1">
        <artist>Elton John</artist>
        <title>Empty Sky</title>
        <mbid>22f9fe0b-9455-4816-9849-d50c0b5f1b09</mbid>
        <url>/music/Elton+John/Empty+Sky</url>
      </album>
    </track>'
    ;
    $xml simplexml_load_string($string);
    echo 
    '<pre>'print_r($xml); echo '</pre>';
    $return = array(
      
    'status' => $xml->album['position'],
      
    'album_title' => $xml->album->title,
      
    'album_url'=>$xml->album->url
    );
    echo 
    '<pre>'print_r(json_encode($return));
    ?>
    В результате
    Код:
    {"status":{"0":"1"},"album_title":{"0":"Empty Sky"},"album_url":{"0":"\/music\/Elton+John\/Empty+Sky"}}
     
  4. Albert22

    Albert22

    Регистр.:
    30 мар 2008
    Сообщения:
    270
    Симпатии:
    10
    И не раз. Толку...)
    Код:
    SimpleXMLElement Object
    (
        [@attributes] => Array
            (
                [status] => ok
            )
    
        [track] => SimpleXMLElement Object
            (
                [id] => 1085741
                [name] => Pinball Wizard
                [mbid] => SimpleXMLElement Object
                    (
                    )
    
                [url] => http://www.last.fm/music/Elton+John/_/Pinball+Wizard
                [duration] => 311000
                [streamable] => 1
                
    [listeners] => 21194
                [playcount] => 57687
                [artist] => SimpleXMLElement Object
                    (
                        [name] => Elton John
                        [mbid] => b83bc61f-8451-4a5d-8b8e-7e9ed295e822
                        [url] => http://www.last.fm/music/Elton+John
                    )
    
                [album] => SimpleXMLElement Object
                    (
                        [@attributes] => Array
                            (
                                [position] => 11
                            )
    
                        [artist] => Elton John
                        [title] => Caribou
                        [mbid] => a9577e29-26c8-4ce5-965f-0b41195aec07
                        [url] => http://www.last.fm/music/Elton+John/Caribou
                        [image] => Array
                            (
                                [0] => http://userserve-ak.last.fm/serve/64s/8729221.jpg
                                [1] => http://userserve-ak.last.fm/serve/126/8729221.jpg
                                [2] => http://userserve-ak.last.fm/serve/174s/8729221.jpg
                                [3] => http://userserve-ak.last.fm/serve/300x300/8729221.jpg
                            )
    
                    )
    
                [toptags] => SimpleXMLElement Object
                    (
                        [tag] => Array
                            (
                                [0] => SimpleXMLElement Object
                                    (
                                        [name] => rock
                                        [url] => http://www.last.fm/tag/rock
                                    )
    
                                [1] => SimpleXMLElement Object
                                    (
                                        [name] => classic rock
                                        [url] => http://www.last.fm/tag/classic%20rock
                                    )
    
                                [2] => SimpleXMLElement Object
                                    (
                                        [name] => elton john
                                        [url] => http://www.last.fm/tag/elton%20john
                                    )
    
                                [3] => SimpleXMLElement Object
                                    (
                                        [name] => 70s
                                        [url] => http://www.last.fm/tag/70s
                                    )
    
                                [4] => SimpleXMLElement Object
                                    (
                                        [name] => cover
                                        [url] => http://www.last.fm/tag/cover
                                    )
    
                            )
    
                    )
    
            )
    
    )
    

    Добавлено через 15 минут

    Спасибо, конечно, однако этот результат у меня и так есть. А требуется
    Код:
    "album_url":"\/music\/Elton+John\/Empty+Sky"
    То есть только строка, а не вложенный объект, массив или ещё чё-то.
    Ибо после вставки яваскриптом получаю Object, undefined и иже с ними. Манипуляции и комбинирование вслепую не помогают.

    Добавлено через 37 минут
    Можно подойти с другой стороны:
    [​IMG]
    Это скриншот того ХМЛ файла.
    Есть тег <image size="large">. Его содержимое достаётся через $xml->track[0]->album[0]->image[2]. Однако, <image size="extralarge"> через $xml->track[0]->album[0]->image[3], хоть он и схож, получить нельзя. Он, равно как и <url> самовложенный какой-то. Как достать то, что в нём? Если получается — тогда все прежние вопросы отпадают...
     
  5. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    попробуй указать тип данных
    'album_url'=>(string)$xml->track[0]->album[0]->url
     
    Albert22 нравится это.
  6. Albert22

    Albert22

    Регистр.:
    30 мар 2008
    Сообщения:
    270
    Симпатии:
    10
    Сработало!
    Спасибо огромное!
     
Статус темы:
Закрыта.