c# - 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>
解决方案
我可以在三个指令中完成。我使用了带有 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();
推荐阅读
- android-app-indexing - 我们无法将您的应用与所选域相关联
- javascript - 如何在 JavaScript 中从此文本中选择可用
- javascript - 如何在javascript中将30分钟添加到指定时间(最小和最大时间)
- dart - 颤振补间基本动画在“FutureBuilder”中不起作用
- javascript - 第二次访问屏幕时 React Native null is not an object (evalating '_this2.state.data') 错误
- swift - 为什么 UIStackView 调整排列的子视图的大小?
- logback - Flink 日志记录限制:如何将日志记录配置传递给 flink 作业
- architecture - 对于特定时间间隔的重复任务队列或 cron 哪个更好?
- android - 在为 x86 构建的 Android SDK 上启动应用程序时出错
- javascript - For 循环在实际发生操作之前将日志打印到控制台