How to make an if statement to show xml attribute based on current time

对着背影说爱祢 提交于 2019-12-10 16:27:10

问题


I have a XML like this:

<PrayerTime
    Day ="1" 
    Month="5" 
    Fajr="07:00" 
    Sunrise="09:00"
    Zuhr="14:00"
/>

A class like this:

public class PrayerTime
{   
    public string Fajr { get; set; }
    public string Sunrise { get; set; }
    public string Zuhr { get; set; }
}

And something to get the value like this:

XDocument loadedCustomData = XDocument.Load("WimPrayerTime.xml");
var filteredData = from c in loadedCustomData.Descendants("PrayerTime")
                   where c.Attribute("Day").Value == myDay.Day.ToString()
                   && c.Attribute("Moth").Value == myDay.Month.ToString()
                   select new PrayerTime()
                   {
                       Fajr = c.Attribute("Fajr").Value,
                       Sunrise = c.Attribute("Sunrise").Value,
                   };
myTextBox.Text = filteredData.First().Fajr;

How can i based by current time of day say that if time is between the value of Fajr and the Value of Sunrise, then myTextBox should show the value of Fajr. If value of current time is between sunrise and Zuhr, show Zuhr?

How can i get it to show the attribute name in myTextBox2? For example, myTextBox shows value "07:00", and myTextBox2 shows "Fajr"?


回答1:


First modify the class as per @abatischcev

public class PrayerTime
{
    public TimeSpan Fajr { get; set; }
    public TimeSpan Sunrise { get; set; }
    public TimeSpan Zuhr { get; set; }
}

Then modify the linq query select part as:

select new PrayerTime()
{
    Fajr = TimeSpan.Parse(c.Attribute("Fajr").Value),
    Sunrise = TimeSpan.Parse(c.Attribute("Sunrise").Value),
    Zuhr = TimeSpan.Parse(c.Attribute("Zuhr").Value)
};

then your check should be:

var obj = filteredData.First();
TimeSpan currentTime = myDay.TimeOfDay;
string result = String.Empty;
if (currentTime >= obj.Fajr && currentTime < obj.Sunrise)
{
    result = "Fajar";
}
else if (currentTime >= obj.Sunrise && currentTime < obj.Zuhr)
{
    result = "Zuhar";
}
textbox1.Text = result;

(By the way, Zuhr time should be between Zuhr and Asar :))




回答2:


First, keep not string but TimeSpan object:

public TimeSpan Fajr { get; set; }
public TimeSpan Sunrise { get; set; }

To do this parse XML into DateTime:

TimeSpan ts = TimeSpan.Parse(c.Attribute("attr"));

So:

TimeSpan now = DateTime.Now.TimeOfDay; // time part only
var data = filteredData.First();

string result = null;
if (data.Fajr <= now && now < data.Sunrise); // notice operators greed
    result = data.Fajr;
else if (data.Sunrise <= now && now <= data.Zuhr)
    result = data.Zuhr;
myTextBox.Text = result;



回答3:


The problem here is your code is "stringly typed". I would be better to use type that is design for time e.g. DateTime, but to quick fix it:

               // don't you need a third one here?
               select new PrayerTime()
               {
                   Fajr = c.Attribute("Fajr").Value,
                   Sunrise = c.Attribute("Sunrise").Value,
               };

Tu get current hour:

int currentHour = DateTime.Now.Hour;

Then is just simple comparison of two integers.

var data = filteredData.First();
int fajrHour = int.Parse(data.Fajr.Substring(0, 2), CultureInfo.InvariantCulture);
int sunriseHour = int.Parse(data.Sunrise.Substring(0, 2), CultureInfo.InvariantCulture);
int zuhrHour = int.Parse(data.Zuhr.Substring(0, 2), CultureInfo.InvariantCulture);

if(fajrHour <= currenHour && currenHour < sunriseHour)
{
    myTextBox.Text = data.Fajr; // or to show value fajrHour.ToString()
}
if(sunriseHour <= currenHour && currenHour  < zuhrHour)
{
    myTextBox.Text = data.Zuhr; //    zuhrHour.ToString()
}
// don't you need a third one here?


来源:https://stackoverflow.com/questions/10485767/how-to-make-an-if-statement-to-show-xml-attribute-based-on-current-time

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!