XML - attribute pairing / value checking via another attribute

Viewed 71

Value of predstava from part prikazivanja needs to be pired with ID in predstave that also contains attribute naziv so the final output of my code looks like this: "1. Vjenceslav Havel AUDIJENCIJA - 16.02.2020. u 19:00 sati" and not like this: "1. 2210 - 16.02.2020. u 19:00 sati" I was told I should create a class for this to work, but I have no idiea how.

CODE:

    int i = 1;
    var kazaliste = XDocument.Load("XML.path");
    var predstave = from predstava in kazaliste.Descendants("prikazivanje")
    select new
    {
    predstava = (string)predstava.Attribute("predstava").Value,
    dan = (string)predstava.Attribute("pocetak_dan").Value.ToString(),
    mjesec = (string)predstava.Attribute("pocetak_mjesec").Value.ToString().PadLeft(2, '0'),
    godina = (string)predstava.Attribute("pocetak_godina").Value.ToString(),
    vrijeme = (string)predstava.Attribute("pocetak_vrijeme").Value.ToString()
    };
    foreach (var predstava in predstave)
    {
        Console.Write(i);
        Console.Write(". ");
        Console.Write(predstava.predstava);
        Console.Write(" - ");
        Console.Write(predstava.dan);
        Console.Write(".");
        Console.Write(predstava.mjesec);
        Console.Write(".");
        Console.Write(predstava.godina);
        Console.Write(". u ");
        Console.Write(predstava.vrijeme);
        Console.Write(" sati");
        Console.WriteLine(" ");
        i++;
    }

XML file contains 3 parts: First part:

<predstave>
    <predstava id="2110" naziv="Vaclav Havel AUDIJENCIJA">
        <glumci>
            <glumac>140</glumac>
            <glumac>200</glumac>
        </glumci>
    </predstava>
</predstave>

second part:

<prikazivanja>
        <prikazivanje predstava="2110" pocetak_dan="16" pocetak_mjesec="2" pocetak_godina="2020" pocetak_vrijeme="19:00"></prikazivanje>
</prikazivanja>

third part:

<glumci>
<glumac id="110" ime="Blanka" prezime="Bart"></glumac>
</glumci>
1 Answers

I can do in three instructions. I used a dictionary with xml linq :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            Dictionary<string, Predstava> dict = doc.Descendants("predstava").Select(x => new Predstava() {
                id = (string)x.Attribute("id"),
                naziv = (string)x.Attribute("naziv"),
                glumac = x.Descendants("glumac").Select(y => (int)y).ToList()
            })
            .GroupBy(x => x.id, y => y)
            .ToDictionary(x => x.Key, y => y.FirstOrDefault());


            string[] results = doc.Descendants("prikazivanje").Select(x => string.Format("{0} - {1}.{2,2:00}.{3}. u {4} sati",
                dict[(string)x.Attribute("predstava")].naziv,
                (string)x.Attribute("pocetak_dan"),
                (int)x.Attribute("pocetak_mjesec"),
                (string)x.Attribute("pocetak_godina"),
                (string)x.Attribute("pocetak_vrijeme")
                )).ToArray();
        }
    }
    public class Predstava
    {
        public string id { get; set; }
        public string naziv { get; set; }
        public List<int> glumac { get; set; }

    }
}

If you need to sort by date use following :

            string[] results = doc.Descendants("prikazivanje").Select(x => new { predstava = dict[(string)x.Attribute("predstava")].naziv, date = new DateTime(
                (int)x.Attribute("pocetak_godina"),
                (int)x.Attribute("pocetak_mjesec"),
                (int)x.Attribute("pocetak_dan"),
                int.Parse(((string)x.Attribute("pocetak_vrijeme")).Substring(0,2)),
                int.Parse(((string)x.Attribute("pocetak_vrijeme")).Substring(3,2)),
                0)})
                .OrderBy(x => x.date)
                .Select(x => string.Format("{0} - {1}",
                    x.predstava,
                    x.date.ToString(@"dd.MM.yyyy. u HH:mm \sa\ti")))
                .ToArray();
Related