Removing specific XML tags

I would like to create an application that removes duplicates from files wpl(Windows PlayList).

The wpl structure looks something like this:

<?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>

It looks like a standard XML file. How to upload a file and get a value srcfor each media tag? How to remove specific media in case of duplicates?

Many thanks.

+3
source share
2 answers

You have two options:

The easiest way is to use XElement. (This is completely untested code.)

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");
+3

- 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 "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");
}
+2

Source: https://habr.com/ru/post/1744672/


All Articles