XML - проверка пары атрибутов / значения через другой атрибут - PullRequest
2 голосов
/ 19 июня 2020

Значение представления из части приказывания должно быть связано с идентификатором в представке, который также содержит атрибут naziv, поэтому окончательный вывод моего кода будет выглядеть следующим образом: «1. Vjenceslav Havel AUDIJENCIJA - 16.02.2020. U 19:00 sati» а не так: «1. 2210 - 16.02.2020. u 19:00 sati» Мне сказали, что я должен создать класс, чтобы это работало, но я не знаю, как это сделать.

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 файл состоит из 3 частей: Первая часть:

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

вторая часть:

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

третья часть:

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

1 Ответ

2 голосов
/ 19 июня 2020

Я могу сделать в трех инструкциях. Я использовал словарь с 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; }

    }
}

Если вам нужно отсортировать по дате, используйте следующее:

            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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...