2011-01-26 34 views
7

Vì một lý do nào đó, iTunes đã quyết định sử dụng định dạng XML không chuẩn với các tệp của họ ... vì vậy tôi đang gặp sự cố khi đọc nó với SimpleXMLElement ...Cách đọc tệp tin iTunes XML trong PHP

iTunes XML sample :

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

Output qua 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 
     ) 

) 

tôi đang chạy vào các vấn đề vì các phím mảng không phù hợp nếu thông tin bị thiếu. Trên một bài phát biểu nó có thể có 8 giá trị số nguyên, trên một số khác nó có thể có 5 .... Cách tốt hơn để tôi đọc dữ liệu này là gì?

+1

này có thể giúp: http://developer.apple.com/internet/opensource/php.html – drudge

+0

@jnpcl - vấn đề với nó là nó không nói làm thế nào để có được nó vào mảng ... – Webnet

+0

Tác giả của bài viết đó cung cấp một liên kết đến nguồn PHP của mình trong đoạn đầu tiên của phần "Phân tích tệp XML" .. – drudge

Trả lời

8

Đây là plist XML file. Apple sử dụng chúng rất nhiều. Tôi sẽ khuyên bạn nên tìm một thư viện phân tích tệp plist thành một cấu trúc dữ liệu gốc thích hợp. plistParser có vẻ hữu ích.

plistParser dụ:

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

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

Output:

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

Đó là hơi muộn, nhưng tôi đã sử dụng lời khuyên này chính xác cho dự án của tôi và tôi đã sử dụng phân tích cú pháp plist cho một gần một năm. Vấn đề lớn là nó là một giải pháp phân tích cú pháp tổng thể Plist phù hợp với các tập tin cấu hình và nhị phân, nhưng nó không xử lý các thư viện iTunes lớn mà không cần sử dụng hàng trăm MB RAM. Gần đây tôi đã tạo một trình phân tích cú pháp dựa trên SAX cho php sẽ chạy đúng cách thông qua một tệp iTunes cung cấp một mảng được định dạng đúng trên mỗi mục nhập bài hát.

bài viết bao gồm các GIST Github bạn sẽ cần là ở đây:

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

+1

liên kết đa qua đơi :( –