3

wpl(Windows PlayList) ファイルから重複を削除するアプリケーションを作成したいと考えています。

wpl 構造体は次のようなものです。

<?wpl version="1.0"?>
<smil>
    <head>
        <meta name="Generator" content="Microsoft Windows Media Player -- 11.0.5721.5145"/>
        <meta name="AverageRating" content="55"/>
        <meta name="TotalDuration" content="229844"/>
        <meta name="ItemCount" content="978"/>
        <author/>
        <title>english</title>
    </head>
    <body>
        <seq>
            <media src="D:\Anime con 2006\Shits\30 Seconds to Mars - 30 Seconds to Mars\30 Seconds to Mars - Capricorn.mp3" tid="{BCC6E6B9-D0F3-449C-91A9-C6EEBD92FFAE}" cid="{D38701EF-1764-4331-A332-50B5CA690104}"/>
            <media src="E:\emule.incoming\Ke$ha - Coming Unglued.mp3" tid="{E2DB18E5-0449-4FE3-BA09-9DDE18B523B1}"/>
            <media src="E:\emule.incoming\Lady Gaga - Bad Romance.mp3" tid="{274BD12B-5E79-4165-9314-00DB045D4CD8}"/>
            <media src="E:\emule.incoming\David Guetta -Sexy Bitch Feat. Akon.mp3" tid="{46DA1363-3DFB-4030-A7A9-88E13DF30677}"/>
        </seq>
    </body>
</smil>

これは、標準の XML ファイルのように見えます。ファイルをロードしてsrc各メディア タグの値を取得するにはどうすればよいですか? 重複した場合、特定のメディアを削除するにはどうすればよいですか?

どうもありがとうございました。

4

2 に答える 2

3

次の 2 つのオプションがあります。

  1. System.Xml.XmlDocumentクラスを使用してファイルをロードします。
  2. System.Xml.Linq.XElementクラスを使用してファイルを読み込みます。

最も簡単なのは、おそらく XElement を使用することです。(これは完全にテストされていないコードです。 )

XElement document = XElement.Load("path to the file");

List<string> sources = new List<string>();
foreach (var mediaElement in document.Descendents("media"))
{
   if (sources.Contains((string)mediaElement.Attributes("src"))
   {
      mediaElement.Remove();
   }
   else
   {
      sources.Add((string)mediaElement.Attributes("src"));
   }
}

document.Save("path to the file");
于 2010-05-09T13:20:28.153 に答える
2

Linq-to-XML (.NET 3.5 以降) を使用して、次のようなことを試すことができます。

XDocument doc = XDocument.Load("yourfile.xml");

var mediaTags = doc.Descendants("media");
int num = mediaTags.Count();

// find one particular node, e.g. by inspecting it's "tid" attribute
XNode node = mediaTags
      .FirstOrDefault(x => x.Attribute("tid").Value == 
                               "{274BD12B-5E79-4165-9314-00DB045D4CD8}");

// if node is found - remove it from XDocument
if(node != null)
{
   node.Remove();

   // save file again
   doc.Save("Your-new-file.xml");
}
于 2010-05-09T13:15:50.037 に答える