Обработка списка воспроизведения ITunes с помощью LINQ XML

Я пытаюсь вытащить треки из списка воспроизведения Itunes, которые не отмечены в Itunes, используя LINQ XML в первый раз.

Дорожки, которые не отмечены, имеют атрибут disabled в файле "ITunes Music Library.xml", которого нет, если трек отмечен.

Пытался использовать этот код и несколько вариантов, но я либо получаю все песни, либо ни одной.

  var songs = from song in XDocument.Load(@"C:\Itunes Music Library.xml").Descendants("plist").Elements("dict").Elements("dict").Elements("dict")
                           select new XElement("song", from key in song.Descendants("key") where song.Attribute("Disabled").Value == "True"  select song);

Также пробовал

where song.Attribute("Disabled") != null select song


 <?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>9.2</string>
    <key>Features</key><integer>5</integer>
    <key>Show Content Ratings</key><true/>
    <key>Music Folder</key><string>file://localhost/C:/Documents%20and%20Settings/paulc.vario/My%20Documents/My%20Music/iTunes/iTunes%20Music/</string>
    <key>Library Persistent ID</key><string>D35B6099ED58C39C</string>
    <key>Tracks</key>
    <dict>
        <key>2350</key>
        <dict>
            <key>Track ID</key><integer>2350</integer>
            <key>Name</key><string>Fake</string>
            <key>Artist</key><string>Alexander O'Neal</string>
            <key>Album Artist</key><string>Alexander O'Neal</string>
            <key>Album</key><string>Hearsay</string>
            <key>Genre</key><string>R&#38;B/Soul</string>
            <key>Kind</key><string>Protected AAC audio file</string>
            <key>Size</key><integer>4817555</integer>
            <key>Total Time</key><integer>277128</integer>
            <key>Disc Number</key><integer>1</integer>
            <key>Disc Count</key><integer>1</integer>
            <key>Track Number</key><integer>5</integer>
            <key>Track Count</key><integer>11</integer>
            <key>Year</key><integer>2003</integer>
            <key>Date Modified</key><date>2005-11-28T20:47:53Z</date>
            <key>Date Added</key><date>2005-07-11T21:58:42Z</date>
            <key>Bit Rate</key><integer>128</integer>
            <key>Sample Rate</key><integer>44100</integer>
            <key>Volume Adjustment</key><integer>102</integer>
            <key>Play Count</key><integer>7</integer>
            <key>Play Date</key><integer>3336718161</integer>
            <key>Play Date UTC</key><date>2009-09-25T09:09:21Z</date>
            <key>Release Date</key><date>2003-01-28T08:00:00Z</date>
            <key>Artwork Count</key><integer>1</integer>
            <key>Persistent ID</key><string>5341AD103345EDA5</string>
                       <key>Disabled</key><true/>
            <key>Track Type</key><string>File</string>
            <key>Protected</key><true/>
            <key>Purchased</key><true/>
            <key>Location</key><string>file://localhost/C:/Documents%20and%20Settings/paulc.vario/My%20Documents/My%20Music/iTunes/iTunes%20Music/Alexander%20O'Neal/Hearsay/05%20Fake.m4p</string>
            <key>File Folder Count</key><integer>4</integer>
            <key>Library Folder Count</key><integer>1</integer>
        </dict>
        <key>2352</key>

person Canacourse    schedule 03.08.2010    source источник
comment
Вау, я действительно удивлен, что никто не посмеялся над Apple за такое использование XML ...   -  person Sascha    schedule 15.12.2015


Ответы (1)


Это будет неприятно, главным образом потому, что формат данных не подходит для запросов в XML. В основном ключ и его значение определяются только порядком элементов в документе. Такой код должен работать:

XDocument doc = XDocument.Load(@"myfile.xml");

var songs = doc.Descendants("dict").Where(d =>
    {
        XElement disabledKey = d.Elements("key").Where(key => key.Value == "Disabled").FirstOrDefault();
        XElement nextElement = disabledKey == null ? null : disabledKey.NextNode as XElement;
        return nextElement != null && nextElement.Name == "true";
    }).Select(d => new XElement("song", d));

foreach (var song in songs)
{
    Console.WriteLine(song);
}
person Vitek Karas MSFT    schedule 03.08.2010
comment
Более сложный, чем я думал. Я должен был выбрать более простую задачу xml, чтобы опробовать LINQ. Спасибо. - person Canacourse; 03.08.2010