2017-03-15 90 views
0

在我的代码,我有一个标志枚举一周的日子里,如下:的XElement使用标志枚举

[Flags] 
public enum DaysOfWeek   // enumeration for days of week 
{ 
    Sunday = 0x0000001, 
    Saturday = 0x0000010, 
    Friday = 0x0000100, 
    Thursday = 0x0001000, 
    Wednesday = 0x0010000, 
    Tuesday = 0x0100000, 
    Monday = 0x1000000, 
    MondayToFriday = Monday | Tuesday | Wednesday | Thursday | Friday, 
    MondayToSaturday = MondayToFriday | Saturday, 
    NotSaturday = MondayToFriday | Sunday, 
    Weekend = Saturday | Sunday, 
    MondayToSunday = MondayToFriday | Weekend, 
    HolidaysOnly = ~MondayToSunday, 
} 

而且我用这个作为在下面的简单示例输出XML:

List<DaysOfWeek> profiles = new List<DaysOfWeek>(); 
profiles.Add(DaysOfWeek.MondayToFriday); 
profiles.Add(DaysOfWeek.MondayToSaturday); 
profiles.Add(DaysOfWeek.Monday | DaysOfWeek.Tuesday); 

XElement xml = new XElement("Profiles", 
       from DaysOfWeek pf in profiles 
       select new XElement("Profile",pf.ToString()) 
       ); 
Console.WriteLine(xml); 

这使我的输出:

<Profiles> 
    <Profile>MondayToFriday</Profile> 
    <Profile>MondayToSaturday</Profile> 
    <Profile>Tuesday, Monday</Profile> 
</Profiles> 

但我想要的是:

<Profiles> 
    <Profile> 
     <MondayToFriday /> 
    </Profile 
    <Profile> 
     <MondayToSaturday /> 
    </Profile> 
    <Profile> 
     <Monday /> 
     <Tuesday /> 
    </Profile> 
</Profiles> 

我明白我的XElement的格式需要扩展,以便我在一周中得到空元素,但是如果我这样做,那么“周二,周一”元素会抛出异常,因为我可以不要使用逗号(或空格)作为元素名称的一部分。

a)如果不使用天的预定义组中的一个,我需要写在一个特定的顺序(周一,周二,周三,周四,周五,周六,周日的元素),这是考虑由模式(见下面的c)。我为自己做了很多努力,因为我已经把它们定义为反向,星期一作为高位,但这是因为我处理的旧数据格式首先将日期显示为字符串中的标志(1/0)那个顺序例如星期一和星期二是“1100000”(左一星期一,右星期一); b)我希望能够输出适当的元素,而不必单独测试所有的东西(尽管如果必须的话,我想我会不得不)。和

c)我正在寻找的输出XML格式是由带有XSD的标准决定的,我无法更改它。

任何好点子?

+0

感谢编辑@ MUG4N。不太清楚最初的位置[去,因为它在我原来的复制代码中! – StuartR143

回答

0

以下内容可能适合您的需求。
它分析标志的输出字符串,并确定内容是否应该是XElement或列表。

public static object GetDaysOfWeekXelementContent(DaysOfWeek pf) 
{ 
    var pfStr = pf.ToString(); 
    if (pfStr.Contains(",")) 
    { 
     return pfStr.Split(',').Select(x => new XElement(x.Trim())); 
    } 
    else 
    { 
     return new XElement(pfStr); 
    } 
} 

static void Main(string[] args) 
{ 
    List<DaysOfWeek> profiles = new List<DaysOfWeek>(); 
    profiles.Add(DaysOfWeek.MondayToFriday); 
    profiles.Add(DaysOfWeek.MondayToSaturday); 
    profiles.Add(DaysOfWeek.Monday | DaysOfWeek.Tuesday); 

    XElement xml = new XElement("Profiles", 
         from DaysOfWeek pf in profiles 
         select new XElement("Profile", GetDaysOfWeekXelementContent(pf)) 
        ); 
    Console.WriteLine(xml); 
} 

编辑关于价值观的排序,你从周日宣布自己的价值观到星期一。您可以逐个解析值,按降序对它们进行排序以使星期一到星期日。
以下应做到:

public static object GetDaysOfWeekXelementContent(DaysOfWeek pf) 
{ 
    var pfStr = pf.ToString(); 
    if (pfStr.Contains(",")) 
    { 
     return pfStr.Split(',').Reverse().Select(x => new XElement(x.Trim())); 
    } 
    else 
    { 
     return new XElement(pfStr); 
    } 
} 
+0

这似乎是一个合理的方法。如果我使用'return pfStr.Split(',')。Reverse()。Select(x => new XElement(x.Trim()));'这也应该解决一周问题的逆转日期? – StuartR143

+0

但为什么要投票? – StuartR143

+0

@ StuartR143您是否希望按字母顺序或通过枚举值来定义日期? – StfBln