删除特定的XML标记

时间:2010-05-09 12:58:23

标签: c# xml wpl

我想创建一个从我的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值? 如果有重复,我该如何删除特定媒体?

非常感谢。

2 个答案:

答案 0 :(得分:3)

您有两种选择:

  1. 使用System.Xml.XmlDocument类加载文件。
  2. 使用System.Xml.Linq.XElement类加载文件。
  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");
}