2011-01-26 13 views
7

Per qualche motivo iTunes ha deciso di utilizzare formati XML non standard con i propri file in modo ... Sto avendo difficoltà a leggere con SimpleXMLElement ...Come leggere file XML di iTunes in PHP

iTunes XML di esempio :

<?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> 

uscita via 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 
     ) 

) 

sto correndo in problemi perché chiavi dell'array sono incoerenti se l'informazione è mancante. Su un discorso può avere 8 valori interi, su un altro può avere 5 .... Qual è un modo migliore per me di leggere questi dati?

+1

Questo potrebbe aiutare: http://developer.apple.com/internet/opensource/php.html – drudge

+0

@jnpcl - il problema è che non dice come ottenerlo nell'array ... – Webnet

+0

L'autore di quell'articolo fornisce un collegamento alla sua sorgente PHP nel primo paragrafo della sezione "File XML di analisi". Collegamento – drudge

risposta

8

Questo è un plist XML file. Apple li usa molto. Consiglierei di trovare una libreria che analizzi il file plist in una struttura dati nativa appropriata. plistParser sembra utile.

plistParser esempio:

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

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

uscita:

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

E 'un po' tardi, ma ho usato questo consiglio esatta per il mio progetto e mi stava usando plist parser per un anno quasi un. Il grosso problema è che è una specie di soluzione di analisi generale di Plist ben adattata ai file di configurazione e binari, ma non gestisce grandi librerie di iTunes senza utilizzare centinaia di megabyte di RAM. Di recente ho creato un parser basato su SAX per php che scorrerà correttamente attraverso un file iTunes consegnando un array formattato correttamente su ogni voce di brano.

dell'articolo e comprendenti i GIST Github avrete bisogno è qui:

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

+1

è morto :( –