2

Itunes は、私が使い慣れていないエクスポート xml 構造を提供してくれます (xml コードを参照)。

<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
    <dict>
        <key>68768</key>
        <dict>
            <key>Track ID</key><integer>68768</integer>
            <key>Name</key><string>ABBA Medley</string>
            <key>Artist</key><string>Party All Stars</string>           
            <key>Disc Number</key><integer>1</integer>
            <key>Track Number</key><integer>17</integer>
            <key>Persistent ID</key><string>B121116C66BE0F4B</string>
        </dict>
        <key>68781</key>
        <dict>
            <key>Track ID</key><integer>68781</integer>
            <key>Name</key><string>Afflitto</string>
            <key>Artist</key><string>Fiocco</string>
            <key>Disc Number</key><integer>1</integer>
            <key>Track Number</key><integer>9</integer>
            <key>Persistent ID</key><string>5D09837999591307</string>
        </dict>
        <key>68793</key>
        <dict>
            <key>Track ID</key><integer>68793</integer>
            <key>Name</key><string>Agadou</string>
            <key>Artist</key><string>Saradossa Band</string>
            <key>Disc Number</key><integer>1</integer>
            <key>Track Number</key><integer>4</integer>
            <key>Persistent ID</key><string>4DFFF3C3498C02B4</string>
        </dict>
    </dict>
</dict>
</plist>

私の目標は、C# で LinqToXml を使用して可能な場合は次の配列を取得することです。

17  ABBA Medley  B121116C66BE0F4B
9   Afflitto     5D09837999591307
4   Agadou       4DFFF3C3498C02B4

これは可能ですか?
基本的な C# コードを書いたのですが、途中で稲妻に打たれました...

XDocument doc = XDocument.Load(iTunesXmlFile);
var linqtoxml = from node in doc.Descendants("dict") select node; // ooo Boy :(

foreach (var dict in linqtoxml)
{
   // and lightning bolt again...
}

Ps: 明らかなように、xml 構造を変更することはできません。
Pps: これはクリーンアップされた iTunes XML バージョンですが、基本的な概念はケース スタディとして提示されています。

4

1 に答える 1

0

私が考えることができる最良の解決策は次のとおりでした:

List<Track> MyTrackList = new List<Track>();

public class Track 
{
    public int TrackNumber { get; set; }
    public string Name { get; set; }
    public string PersistentID { get; set; }
} 

XDocument doc = XDocument.Load(@"thexmlfile.xml");
var linqtoxml = from element in doc.Descendants("plist").Descendants("dict").Descendants("dict").Descendants("dict")
                select element;

foreach (var dict in linqtoxml)
{
    try
    {
        string myTrackNumber = dict.Descendants("key").Where(key => key.Value == "Track Number").Select(x => x.NextNode).SingleOrDefault().ToString(); 
        string myName = dict.Descendants("key").Where(key => key.Value == "Name").Select(x => x.NextNode).SingleOrDefault().ToString();                                 
        string myPersistentID = dict.Descendants("key").Where(key => key.Value == "Persistent ID").Select(x => x.NextNode).SingleOrDefault().ToString();

        MyTrackList.Add(new Track
        {
            TrackNumber = myTrackNumber,
            Name = myName,
            PersistentID = myPersistentID
        });

    }
    catch (Exception)
    {
        // Something wasn't set, so skip the node ...
    }            
}
于 2013-01-14T10:07:16.707 に答える