2016-12-16 3 views
0

私は以下のXMLファイルをいくつか成功させて解析しようとしています。オンライン私は一緒に次のC#コードをつなぎいるいくつかのチュートリアルを使用して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> 

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ごとにクラスを構造化する必要があります。だからTasksなどを持っているSettingsクラスです。このようなもの。私はもちろん、すべてのXML属性を入れていません。しかし、あなたは要点を取得する必要があります。 [XMLAttribute]属性は、XML属性を表すプロパティを飾る必要があります。また、すべてのプロパティ名で大文字と小文字が区別されます。だから彼らが一致することを確認してください(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; } 
    } 

次に、あなたがあなたのクラスにXMLをシリアライズするXmlSerializerを使用することができます。

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 
      } 
     } 
    } 

注意すべき他のもの:だからあなたのParseXml()方法は次のようになります彼らは文字列と標準的な慣習です表すために変数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")]のようなプロパティ名を指定するコードは不要ですか?もしそうなら、なぜですか? –

関連する問題