2016-12-16 77 views
0

我一直試圖解析下面的XML文件,並取得了一些成功。C#解析複雜的XML LINQ

<?xml version="1.0"?> 
<Settings> 
    <Tasks> 
     <Task ID="1" Name="task_1" Active="1" NextEID="25" AR="0" CacheNames="random"> 
      <Schedules> 
       <Schedule OnlyUntilFirstSuccess="0" FailIfNoSuccessInSched="0" RunEvenIfNotif="0"> 
        <Days> 
         <DayOfWeek>Monday</DayOfWeek> 
         <DayOfWeek>Tuesday</DayOfWeek> 
         <DayOfWeek>Wednesday</DayOfWeek> 
         <DayOfWeek>Thursday</DayOfWeek> 
         <DayOfWeek>Friday</DayOfWeek> 
         <DayOfWeek>Saturday</DayOfWeek> 
         <DayOfWeek>Sunday</DayOfWeek> 
        </Days> 
        <Frequency> 
         <Interval StartTime="09:45" EndTime="09:45" EveryMinutes="0"></Interval> 
        </Frequency> 
       </Schedule> 
      </Schedules> 
     </Task> 
     <Task ID="2" Name="task_2" Active="1" NextEID="25" AR="0" CacheNames="random"> 
      <Schedules> 
       <Schedule OnlyUntilFirstSuccess="0" FailIfNoSuccessInSched="0" RunEvenIfNotif="0"> 
        <Days> 
         <DayOfWeek>Monday</DayOfWeek> 
         <DayOfWeek>Tuesday</DayOfWeek> 
         <DayOfWeek>Wednesday</DayOfWeek> 
         <DayOfWeek>Thursday</DayOfWeek> 
         <DayOfWeek>Friday</DayOfWeek> 
         <DayOfWeek>Saturday</DayOfWeek> 
         <DayOfWeek>Sunday</DayOfWeek> 
        </Days> 
        <Frequency> 
         <Interval StartTime="12:45" EndTime="09:45" EveryMinutes="0"></Interval> 
        </Frequency> 
       </Schedule> 
      </Schedules> 
     </Task> 
    </Tasks> 
</Settings> 

使用一些在線教程我已經拼湊下面的C#代碼:

public static void ParseXml() 
     { 
      string strFile = "File.xml"; 

      XDocument xdoc = XDocument.Load(strFile); 

      var tasks = from s in xdoc.Descendants("Tasks") 
         select new 
         { 
          taskID = s.Element("Task").Attribute("ID").Value, 
          taskName = s.Element("Task").Attribute("Name").Value, 
          taskActive = s.Element("Task").Attribute("Active").Value, 
          taskSchedule = s.Element("Task").Element("Schedules").Element("Schedule").Element("Days") 
         }; 

      foreach (var t in tasks) 
      { 
       Console.WriteLine("Task Id :: {0}", t.taskID); 
       Console.WriteLine("Task Name :: {0}", t.taskName); 
       Console.WriteLine("Task Status :: {0}", t.taskActive); 
       Console.WriteLine("Task Schedule :: {0}", t.taskSchedule); 
      } 

      Console.ReadKey(); 
     } 

我的目標是要分析出每一個任務,任務ID,名稱,天,頻率。我想最終能夠使用這些值來繪製散點圖圖上的TaskID和StartTime。我嘗試創建以下類,認爲它可以幫助我處理文件,但我不知道如何將它們結合在一起。

 public class Task 
     { 
      public static int taskId { get; set; } 
      public static string taskName { get; set; } 
     } 

     public class Schedule 
     { 
      public enum DayOfWeek 
      { 
       Monday, 
       Tuesday, 
       Wednsday, 
       Thursday, 
       Friday, 
       Saturday, 
       Sunday 
      } 
     } 

     public class Frequency 
     { 
      public static DateTime startTime { get; set; } 
      public static DateTime endTime { get; set; } 
      public static int everyMins { get; set; } 
     } 

任何幫助/方向將不勝感激。如果有的話,請不要發佈解決方案。請解釋它,以便我可以從中學習並在將來爲這個社區做出貢獻。

謝謝! Gabe

回答

0

首先,您需要根據源XML構建您的類。因此,Settings類別中您有Tasks等等。像這樣的東西。當然,我還沒有放入所有的XML屬性。但你應該得到的主旨。您需要裝飾表示XML屬性的屬性的[XMLAttribute]屬性。所有屬性名稱都區分大小寫。所以請確保它們匹配(ID而不是Id)。有辦法解決此使用屬性,但:

public class Settings 
    { 
     public List<Task> Tasks { get; set; } 
    } 

    public class Task 
    { 
     [XmlAttribute] 
     public int ID { get; set; } 

     [XmlAttribute] 
     public string Name { get; set; } 
     public List<Schedule> Schedules { get; set; } 

    } 

    public class Schedule 
    { 
     [XmlAttribute] 
     public string OnlyUntilFirstSuccess { get; set; } 
     public List<DayOfWeek> Days { get; set; } 
     public Frequency Frequency { get; set; } 

    } 
    public class Frequency 
    { 
     public Interval Interval { get; set; } 
    } 

    public class Interval 
    { 
     [XmlAttribute] 
     public string StartTime { get; set; } 
     [XmlAttribute] 
     public string EndTime { get; set; } 
     [XmlAttribute] 
     public int EveryMins { get; set; } 
    } 

然後你可以使用一個XmlSerializer到XML序列化類。所以,你的ParseXml()方法應該是這個樣子:

public static void ParseXml() 
    { 
     string fileName = "File.xml"; 
     XDocument xdoc = XDocument.Load(fileName); 
     using (TextReader reader = new StringReader(xdoc.ToString())) 
     { 
      try 
      { 
       var settings = (Settings)new XmlSerializer(typeof(Settings)).Deserialize(reader); 
      } 
      catch (Exception ex) 
      { 
       // Handle exceptions as you see fit 
      } 
     } 
    } 

其他注意事項:不命名變量strxxxxx表示他們是字符串,標準慣例是公共變量名稱以大寫字母。 此外,你需要以下:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Xml.Linq; 
using System.Xml.Serialization; 
+0

所以,如果我的XML文件中包含其他元素\我需要創建一個類爲每個就算我不關心他們爲我的整個項目的屬性? –

+0

@ Ashwin Nair - 什麼是私有變量的約定?那些是小寫的?我經常看到名稱前面帶有下劃線「_」的變量。下劃線表示什麼? –

+0

@ Ashwin Nair - 還有幾個問題,我不確定我是否理解你宣佈Frequency和Interval類的方式。你能詳細解釋一下嗎?我也看過代碼,其中屬性上的裝飾器不僅指定對象類型,而且指定屬性名稱:[XMLAttribute(「EveryMinutes」)]是不必要的?如果是的話爲什麼 –