我想创建一个从我的wpl
(Windows播放列表)文件中删除重复项的应用程序。
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
值?
如果有重复,我该如何删除特定媒体?
非常感谢。
答案 0 :(得分:3)
您有两种选择:
最简单的可能就是使用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");
答案 1 :(得分: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");
}