2011-01-26 19 views
7

Por alguna razón iTunes ha decidido utilizar formatos XML no estándar con sus archivos ... así que estoy teniendo problemas para leer con SimpleXMLElement ...Cómo leer el archivo XML de iTunes en PHP

iTunes XML de ejemplo :

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>Major Version</key><integer>1</integer> 
    <key>Minor Version</key><integer>1</integer> 
    <key>Application Version</key><string>10.1.1</string> 
    <key>Features</key><integer>5</integer> 
    <key>Show Content Ratings</key><true/> 
    <key>Music Folder</key><string>file://localhost/D:/iTunes/Bob%20Russell%20Sermons/iTunes%20Media/</string> 
    <key>Library Persistent ID</key><string>B8EB1073DB45BBA1</string> 
    <key>Tracks</key> 
    <dict> 
     <key>290</key> 
     <dict> 
      <key>Track ID</key><integer>290</integer> 
      <key>Name</key><string>01-03 Good News</string> 
      <key>Artist</key><string>Bob Russell</string> 
      <key>Album</key><string>Not in Series</string> 
      <key>Grouping</key><string>Gospel, Decision Day, Salvation, Sin, Commandments, Mercy, Grace, Jesus Christ, Crucifixion, Resurrection, Justice, Hope</string> 
      <key>Genre</key><string>Speech</string> 
      <key>Kind</key><string>MPEG audio file</string> 
      <key>Size</key><integer>18140686</integer> 
      <key>Total Time</key><integer>1774132</integer> 
      <key>Year</key><integer>1999</integer> 
      <key>Date Modified</key><date>2010-09-09T17:41:58Z</date> 
      <key>Date Added</key><date>2011-01-18T19:31:43Z</date> 
      <key>Bit Rate</key><integer>80</integer> 
      <key>Sample Rate</key><integer>44100</integer> 
      <key>Comments</key><string>John 3:16-21; Light has come into the world, but men loved darkness; Romans 1:20; gather you as a mother hen gather chicks;1 Corinthians 15:19</string> 
      <key>Artwork Count</key><integer>1</integer> 
      <key>Persistent ID</key><string>7B3B348BF9BB95CE</string> 
      <key>Track Type</key><string>File</string> 
      <key>Location</key><string>file://localhost/D:/iTunes/Bob%20Russell%20Sermons/Sermons/1999/01-03%20Good%20News.mp3</string> 
      <key>File Folder Count</key><integer>3</integer> 
      <key>Library Folder Count</key><integer>1</integer> 
     </dict> 

salida a través de SimpleXML:

SimpleXMLElement Object 
(
    [key] => Array 
     (
      [0] => Track ID 
      [1] => Name 
      [2] => Artist 
      [3] => Album 
      [4] => Genre 
      [5] => Kind 
      [6] => Size 
      [7] => Total Time 
      [8] => Year 
      [9] => Date Modified 
      [10] => Date Added 
      [11] => Bit Rate 
      [12] => Sample Rate 
      [13] => Comments 
      [14] => Artwork Count 
      [15] => Persistent ID 
      [16] => Track Type 
      [17] => Location 
      [18] => File Folder Count 
      [19] => Library Folder Count 
     ) 

    [integer] => Array 
     (
      [0] => 332 
      [1] => 6419273 
      [2] => 1415262 
       [3] => 1991 
      [4] => 32 
      [5] => 22050 
      [6] => 1 
      [7] => 3 
      [8] => 1 
     ) 

    [string] => Array 
     (
      [0] => 07-07 Thank God for America 
      [1] => Bob Russell 
      [2] => No Series 
      [3] => Speech 
      [4] => MPEG audio file 
      [5] => Isaiah 40:13-26 
      [6] => 94BD9A32817C24F1 
      [7] => File 
      [8] => file://localhost/D:/iTunes/Bob%20Russell%20Sermons/Sermons/1999/07-07%20Thank%20God%20for%20America.mp3 
     ) 

    [date] => Array 
     (
      [0] => 2010-05-28T03:27:34Z 
      [1] => 2011-01-18T19:31:47Z 
     ) 

) 

estoy corriendo en cuestiones claves de matriz porque son incompatibles si falta información. En un discurso, puede tener 8 valores enteros, en otro puede tener 5 ... ¿Cuál es la mejor manera de leer estos datos?

+1

Esto podría ayudar: http://developer.apple.com/internet/opensource/php.html – drudge

+0

@jnpcl - el problema con eso es que no dice cómo meterlo en la matriz ... – Webnet

+0

El autor de ese artículo proporciona un enlace a su fuente PHP en el primer párrafo de la sección "Análisis de archivos XML". – drudge

Respuesta

8

Esto es plist XML file. Apple los usa mucho. Recomendaría encontrar una biblioteca que analice el archivo plist en una estructura de datos nativa adecuada. plistParser parece útil.

ejemplo plistParser:

<?php 
include("PlistParser.inc"); 

$parser = new plistParser(); 
$plist = $parser->parse(dirname(__FILE__) . "/iTunes.xml"); 
var_dump($plist); 
?> 

Salida:

array(8) { 
    ["Major Version"]=> 
    int(1) 
    ["Minor Version"]=> 
    int(1) 
    ["Application Version"]=> 
    string(5) "8.0.1" 
    ["Features"]=> 
    int(5) 
    ["Show Content Ratings"]=> 
    bool(true) 
    ["Music Folder"]=> 
    string(60) "file://localhost/Users/testUser/Music/iTunes/iTunes%20Music/" 
    ["Library Persistent ID"]=> 
    string(15) "C39203948AF3D3E" 
    ["Tracks"]=> 
    array(1) { 
    [1]=> 
    array(25) { 
     ["Track ID"]=> 
     int(1) 
     ["Name"]=> 
     string(8) "My Track" 
     ["Artist"]=> 
     string(9) "My Artist" 
     ["Album"]=> 
     string(8) "My Album" 
     ["Genre"]=> 
     string(8) "My Genre" 
     ["Kind"]=> 
     string(15) "MPEG audio file" 
     ["Size"]=> 
     int(123456) 
     ["Total Time"]=> 
     int(123456) 
     ["Track Number"]=> 
     int(1) 
     ["Year"]=> 
     int(2008) 
     ["Date Modified"]=> 
     string(20) "2008-03-03T03:33:33Z" 
     ["Date Added"]=> 
     string(20) "2008-03-03T03:33:33Z" 
     ["Bit Rate"]=> 
     int(128) 
     ["Sample Rate"]=> 
     int(44100) 
     ["Comments"]=> 
     string(20) "All Rights Reserved." 
     ["Release Date"]=> 
     string(20) "2007-03-12T04:01:37Z" 
     ["Persistent ID"]=> 
     string(14) "C3E339393939E3" 
     ["Track Type"]=> 
     string(4) "File" 
     ["Podcast"]=> 
     bool(false) 
     ["Unplayed"]=> 
     bool(true) 
     ["File Type"]=> 
     int(123456) 
     ["File Creator"]=> 
     int(123456) 
     ["Location"]=> 
     string(66) "file://localhost/Users/testUser/Music/iTunes/iTunes%20Music/my.mp3" 
     ["File Folder Count"]=> 
     int(4) 
     ["Library Folder Count"]=> 
     int(1) 
    } 
    } 
} 
2

Es un poco tarde, pero he usado este consejo exacto para mi proyecto y yo estaba usando analizador plist de casi un año. El gran problema es que es una especie de solución general de análisis Plist bien adaptada a los archivos de configuración y binarios, pero no maneja grandes bibliotecas de iTunes sin usar cientos de megabytes de RAM. Recientemente, he creado un analizador basado en SAX para php que se transmitirá correctamente a través de un archivo de iTunes que entrega una matriz con el formato correcto en cada entrada de canción.

artículo, incluido los GIST Github que necesita está aquí:

http://streeme.posterous.com/how-to-read-an-itunes-music-library-xml-file

+1

enlace está muerto :( –