首页 > 解决方案 > XML - 通过另一个属性进行属性配对/值检查

问题描述

来自 prikazivanja 部分的 predstava 的值需要使用 predstave 中的 ID 进行匹配,该 ID 还包含属性 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>

标签: c#xml

解决方案


我可以在三个指令中完成。我使用了带有 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();

推荐阅读