2017-03-15 89 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