# この記事は、ちょっと(いつもの通り)中途半端です。申し訳ない。
いまさらXML
XMLと一言でいっても、中は結構複雑、その世界は4つの技術で構成されている。- 構造記述言語 XML
- 変換言語 XSLT
- リンク言語 XPointer
- 問い合わせ言語 XPath
XMLで記述されたファイルiTunes.xmlを、XSLTで目的のhtmlに変換する。 XSLは、必要な個所をXPATHを使って探し出しXPointerが取り出す。
iTunes Music Library.xmlの構造
ライブラリを管理しているファイルitunes Music Library.xml
は、私のMac OSXの場合、以下の場所にある。実際には、ライブラリを移動している人もいますから、検索したほうが良い。~/Music/iTunes/iTunes Music Library.xml
# windowsではどこなのか知りません。:-p
各情報は、dictタグでくくられている。
各情報の要素は、Keyタグとその値の組み合わせで記載。
トラック情報の要素は、名前、
内容を、先頭のほうを覗いてみると
<?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>Date</key><date>2011-11-19T23:48:40Z</date> <key>Application Version</key><string>10.5.1</string> <key>Features</key><integer>5</integer> <key>Show Content Ratings</key><true/> <key>Music Folder</key><string>file://localhost/Users/baker/Music/iTunes/iTunes%20Media/</string> <key>Library Persistent ID</key><string>BB0A0B413A2028D8</string> <key>Tracks</key> <dict> <key>3708</key> <dict> <key>Track ID</key><integer>3708</integer> <key>Name</key><string>Time Difference</string> <key>Artist</key><string>Hiromi's Sonicbloom</string> <key>Composer</key><string>上原 ひろみ</string> (以下略)となっている。
DTD (Document type Definition 文書型宣言)として、http://www.apple.com/DTDs/PropertyList-1.0.dtd ファイルが指定されている。DTDは、このファイルが所属している文書の構造を定義しているファイル。構造とは、どんな要素から成り立っているか、特別に定義しているタグ(要素)はなにか、属性の書き方はどうなっているかとか、もろもろ。XMLは、共通する書き方があり、ほとんどのブラウザは、XMLとして正しい(Well formated)を判断してくれますが、文書の目的にそって正しく書いているかは、判断してくれません。当然です。そのルール(まあ、ローカルルールですな)を記載しているのが、DTDです。
最初のDOCTYPEコメント(文書型宣言)から、
"-" 企業のローカルな取り決めであり、Apple Computerが定めており、文書名は "DTD PLIST 1.0" (多分、Play Listなのかな)、Englishで書かれていますと言うことが判ります。
iTunes.xmlのDTDを取得してみると、以下のように単純です。
<!ENTITY % plistObject "(array | data | date | dict | real | integer | string | true | false )" > <!ELEMENT plist %plistObject;> <!ATTLIST plist version CDATA "1.0" > <!-- Collections --> <!ELEMENT array (%plistObject;)*> <!ELEMENT dict (key, %plistObject;)*> <!ELEMENT key (#PCDATA)> <!--- Primitive types --> <!ELEMENT string (#PCDATA)> <!ELEMENT data (#PCDATA)> <!ELEMENT date (#PCDATA)> <!-- Numerical primitives --> <!ELEMENT true EMPTY> <!ELEMENT false EMPTY> <!ELEMENT real (#PCDATA)> <!ELEMENT integer (#PCDATA)>
- 実体宣言(ENTITY)で、plistObjectを定義しています。
- "%plistObject"は、"array, data , dict, real , integer, string, true, false の何れか”と言う文字に置き換えなさいと言うことでしょうか。%記号は、宣言名であることを示しています。
- 次の行で、要素(ELEMENT) plistの配下の構成(ノード)は、%plistObject だ定義しています。
- さらに、plistは属性(ATTLIST) として、version をもちます。versionは、任意の文字列(CDATA)であり、初期値は"1.0"なんだそうです。
- array要素は、配下に %plistObjectをもちますが、何回も繰り返しもって良いそうです。
- dist要素は、配下に、%plistObjectとkeyをもち、これも繰り返しできます。
- key要素は、任意の文字列を配下に持ちます。
こんなところでしょうか。
DTDを下に、再度 iTunes Music Library.xmlを眺めていると、なんか構造が見えてきた気がしませんか。
# plist (play list) Version = 1.0 # dict (dictionary? , 辞書? この場合、play list自身の属性) # key と %plistObject 要素で、playlist自身の内容を記載。 # key "TRACKS" の中に、dictの集団がある。 # dict メディアの情報 # key トラック番号 integer 1 # key 名前 string xxxxx ... ... # dict メディアの情報 # key トラック番号 integer 1 # key 名前 string xxxxx ... (繰り返し)
なんか、かえって判んなくなってきたかな。
次回は、htmlファイルにパースしてみる予定。
0 件のコメント:
コメントを投稿