0

I did this code to retrieve the info from an .mp3 file using TagLib and display it into an XML document with LINQ to XML, here's the right code:

static class Program
{   
    [STAThread]
    static void Main()
    {
        TagLib.File file = TagLib.File.Create(@"path of one of my .mp3 files");
        XDocument xdoc = new XDocument(
            new XDeclaration("1.0", "utf-8", "yes"),
            new XElement("Music", new XAttribute("id", 001),
                new XElement("Album", file.Tag.Album),
                new XElement("AlbumArtist", file.Tag.AlbumArtists),
                new XElement("Title", file.Tag.Title),
                new XElement("Track", file.Tag.Track),
                new XElement("Genre", file.Tag.Genres),
                new XElement("Path", Path.GetFullPath("El Gozo (version acústica).mp3")))
            );
        xdoc.Save(@"C:\Users\ivan_000\Music\Data.xml");   
    }
}

But now I've been trying many ways to develop the same program with several .mp3 files to be stored on the same XML document and it's not working.

static void Main()
{

    TagLib.File file = TagLib.File.Create(@"C:\Users\ivan_000\Music\El Gozo  (version acústica).mp3");
    TagLib.File file2 = TagLib.File.Create(@"C:\Users\ivan_000\Music\En el Trono está.mp3");
    TagLib.File file3 = TagLib.File.Create(@"C:\Users\ivan_000\Music\Por Siempre.mp3");

    XDocument xdoc = new XDocument(
        new XDeclaration("1.0", "utf-8", "yes"),
        new XElement("Music", new XAttribute("id", 001),
        new XElement("Album", file.Tag.Album),
        new XElement("AlbumArtist", file.Tag.FirstAlbumArtist),
        new XElement("Title", file.Tag.Title),
        new XElement("Track", file.Tag.Track),
        new XElement("Genre", file.Tag.FirstGenre),
        new XElement("Path", Path.GetFullPath("El Gozo (version acústica).mp3"))),
        new XElement("Music", new XAttribute("id", 002),
        new XElement("Album", file2.Tag.Album),
        new XElement("AlbumArtist", file2.Tag.FirstAlbumArtist),
        new XElement("Title", file2.Tag.Title),
        new XElement("Track", file2.Tag.Track),
        new XElement("Genre", file2.Tag.FirstGenre),
        new XElement("Path", Path.GetFullPath("Por Siempre.mp3"))),
        new XElement("Music", new XAttribute("id", 003),
        new XElement("Album", file3.Tag.Album),
        new XElement("AlbumArtist", file3.Tag.FirstAlbumArtist),
        new XElement("Title", file3.Tag.Title),
        new XElement("Track", file3.Tag.Track),
        new XElement("Genre", file3.Tag.FirstGenre),
        new XElement("Path", Path.GetFullPath("Por Siempre.mp3")))
    );
    xdoc.Save(@"C:\Users\ivan_000\Music\Data.xml");   
} 
Jeff Mercado
  • 129,526
  • 32
  • 251
  • 272
  • Define not working. That's a very vague term. Do you get an error? Is the file formatted wrong? Etc. – Tim Oct 07 '15 at 23:25
  • what I meant with "not working" is that the program was not compiling due to an error "the XDocument structure is not correct". PD: I resolved the code problem but now my issue is that one of the app requirements needs to save several mp3's info on a single xml. – Alex Ventura Oct 08 '15 at 13:29

1 Answers1

0

An XML document may only have a single root element. You're attempting to create three. Place your elements within a single root element.

var musicDir = Environment.GetFolderPath(Environment.SpecialFolder.MyMusic);
var paths = Directory.EnumerateFiles(musicDir, @"*.mp3");
var doc = new XDocument(
    new XElement("root", // place the Music elements under root
        from x in paths.Select((p, i) => new { Path = p, Index = i })
        let file = TagLib.File.Create(x.Path)
        select new XElement("Music",
            new XAttribute("id", x.Index + 1),
            new XElement("Album", file.Tag.Album),
            new XElement("AlbumArtist", file.Tag.FirstAlbumArtist),
            new XElement("Title", file.Tag.Title),
            new XElement("Track", file.Tag.Track),
            new XElement("Genre", file.Tag.FirstGenre),
            new XElement("Path", x.Path)
        )
    )
);
doc.Save(Path.Combine(musicDir, "Data.Xml"));
Jeff Mercado
  • 129,526
  • 32
  • 251
  • 272