【问题标题】:Based on date, get todays and the next two days values from XML?根据日期,从 XML 获取今天和接下来两天的值?
【发布时间】:2012-05-09 04:56:50
【问题描述】:

目标: 根据今天的日期和月份,从 XML 中获取实际和接下来两天的值。

问题: 尽管我的 c.Attribute("Day").Value 发生了变化,但我的 c.Attribute("Month").Value 保持不变。因此,如果实际日期是 30.04.2012,那么它将显示 30.04.2012 的祈祷时间,而不是 01.05.2012 和 02.05.2012。如何解决?

我也不确定这个Dato = c.Attribute("Day").Value + "." + c.Attribute("Month").Value + "." + myDay.Year.ToString(), 好不好?我希望列表框显示它获取的 xml 的日期。

请帮忙。 下面是我的代码、XML 和类。

var filteredData3 = from c in loadedCustomData.Descendants("PrayerTime")
    where int.Parse(c.Attribute("Day").Value) >= myDay.Day && int.Parse(c.Attribute("Day").Value) < (myDay.Day + 3) 
    && c.Attribute("Month").Value == myDay.Month.ToString()


        select new Bønn()
        {

        Dato = c.Attribute("Day").Value + "." + c.Attribute("Month").Value + "." + myDay.Year.ToString(),
        Fajr = TimeSpan.Parse(c.Attribute("Fajr").Value),
        Sunrise = TimeSpan.Parse(c.Attribute("Sunrise").Value),
        Zohr = TimeSpan.Parse(c.Attribute("Zohr").Value),
        Asr = TimeSpan.Parse(c.Attribute("Asr").Value),
        Maghrib = TimeSpan.Parse(c.Attribute("Maghrib").Value),
        Isha = TimeSpan.Parse(c.Attribute("Isha").Value),
        Jumma = TimeSpan.Parse(c.Attribute("Jumma").Value),

        };

listBox1.ItemsSource = filteredData3;

这是我的课:

public class Bønn
{

    public TimeSpan Fajr { get; set; }
    public TimeSpan Sunrise { get; set; }
    public TimeSpan Zohr { get; set; }
    public TimeSpan Asr { get; set; }
    public TimeSpan Maghrib { get; set; }
    public TimeSpan Isha { get; set; }
    public TimeSpan Jumma { get; set; }

    public string Dato { get; set; }

}

这是我的 XML:

<PrayerTime
        Dag ="30" 
        Måned="4" 
        Fajr="04:09" 
        Sunrise="05:19" 
        Zohr="13:19" 
        Asr="18:30"
        Maghrib="21:14" 
        Isha="22:24" 

    />
    <PrayerTime
        Dag ="1" 
        Måned="5" 
        Fajr="04:08" 
        Sunrise="05:16" 
        Zohr="13:19" 
        Asr="18:31"
        Maghrib="21:17" 
        Isha="22:25" 

    />
    <PrayerTime
        Dag ="2" 
        Måned="5" 
        Fajr="04:06" 
        Sunrise="05:13" 
        Zohr="13:19" 
        Asr="18:33"
        Maghrib="21:19" 
        Isha="22:27" 
    />

【问题讨论】:

  • 这是一个重复的问题 Mega,我已标记您的旧问题以关闭。以后你应该修改你的旧问题或删除它。

标签: c# linq linq-to-xml


【解决方案1】:

我建议您将“模型”类更改为使用DateTime 而不是string 作为日期。将所有元素转换为您的模型类,然后然后过滤。这将比尝试根据属性进行算术简单得多。

另请注意,使用来自XAttribute 的显式转换比在任何地方调用int.Parse 更简单。我实际上建议在您的模型类中创建一个静态 FromXElement 方法,这样您就可以编写:

DateTime start = DateTime.Today;
// We'll use this as an *exclusive* upper bound
DateTime end = start.AddDays(3);

var query = from c in loadedCustomData.Descendants("PrayerTime")
            let bonn = Bønn.FromXElement(c)
            where bonn.Dato >= start && bonn.Dato < end;
            select bonn;

或者在扩展方法语法中:

// start and end as before
var query = loadedCustomData.Descendants("PrayerTime")
                .Select(c => Bønn.FromXElement(c))
                .Where(bonn => bonn.Dato >= start && bonn.Dato < end);

【讨论】:

  • 为什么不使用一个使用 XElement 而不是 FromXElement 的构造函数?
  • @ChuckSavage:我开始发现命名静态方法比构造函数更具可读性,特别是当您可能想要两个具有相同参数类型的此类方法时,例如TimeSpan.FromHoursTimeSpan.FromDays。对于转换,我通常使用静态 FromXyz 方法和实例 ToXyz 方法。
  • hmm.. 我在 c# 中获得了非常基本的技能,现在我被卡住了,因为我没有从桌子上得到任何东西。问题是我的 XML 不包含年份。一种属性代表日,一种属性代表月。它现在可以正常工作,但是有关于月底的问题。它还说在波恩类中找不到 FromXElement...
  • @Megaoctane:如果它不包含年份,则使用当前年份,如果元素看起来是下一年(基于月/日),则可能添加年份。正如我所建议的那样,您需要自己编写FromXElement 方法 - 这就是您放置基于XElement 构造新实例的代码的地方。听起来你现在可能有点超出你的深度......我当然会先让它在一个小型控制台应用程序中运行,然后再将它放入 WP7。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
相关资源
最近更新 更多