【问题标题】:XML - attribute pairing / value checking via another attributeXML - 通过另一个属性进行属性配对/值检查
【发布时间】:2020-06-18 23:25:32
【问题描述】:

来自 prikazivanja 部分的 predstava 的值需要使用 predstave 中的 ID 进行 pired,该 ID 还包含属性 naziv,因此我的代码的最终输出如下所示: “1. Vjenceslav Havel AUDIJENCIJA - 16.02.2020。你 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>

【问题讨论】:

  • 到目前为止,您的问题还不清楚,并且缺少源 XML、解决问题的尝试和目标 XML。
  • 这样好吗?真的很抱歉,我一直在尝试自己解决这个问题,但没有成功。
  • 现在,您的问题可以回答了。但不是我。我可以在xslt 中回答您的问题,但不能在c# 中回答。祝你好运,但我认为很快就会得到答复。

标签: c# xml


【解决方案1】:

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

【讨论】:

  • 谢谢谢谢谢谢!在最后添加数组的打印内容后,我得到了想要的结果!需要说明的是,我真的很喜欢这一点,在过去的 9 个月里,我必须学习使用 C++、C#、MySQL 和 .NET 框架编写代码,而 .NET 是我现在的重点,所以你让我省了很多麻烦!跨度>
  • 我将填充从 ToString("0#") 更改为格式 {2,2:00}
  • 我创建了一个 DateTime 来允许排序。
  • 是的。您是否需要在相同的输出中获得所有三个部分?您可以创建第二个字典 Dictionary> 其中 ime 和 prezime 是 KeyValuePairs。
  • 我更新了代码以使字典包含节点 predstava 中的所有项目。我还修改了对字典的查找:我更新了代码以使字典包含节点 predstava 中的所有项目
猜你喜欢
  • 1970-01-01
  • 2022-06-13
  • 2010-11-24
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多