2009-12-18 97 views
0

我正在嘗試使用LINQ讀取XML文件。閱讀和解析簡單的XML文件沒有問題,但是這個讓我難住。 以下是該文件的一部分:該文件格式正確且有效。LINQ to XML:讀取C#中的XML

<Activities> 
    <Activity Sport="Other"> 
     <Id>2009-12-17T19:53:14Z</Id> 
     <Lap StartTime="2009-12-17T19:53:14Z"> 
     <TotalTimeSeconds>820.5400000</TotalTimeSeconds> 
     <DistanceMeters>1510.3433838</DistanceMeters> 
     <MaximumSpeed>2.6089859</MaximumSpeed> 
     <Calories>104</Calories> 
     <AverageHeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t"> 
      <Value>128</Value> 
     </AverageHeartRateBpm> 
     <MaximumHeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t"> 
      <Value>139</Value> 
     </MaximumHeartRateBpm> 
     <Intensity>Active</Intensity> 
     <TriggerMethod>Manual</TriggerMethod> 

... 這裏是我的代碼

XDocument document = XDocument.Load(myfileXml); 

var query = from gtc in document.Descendants("Activities").Elements("Lap") 
      select new 
      { 
       Id = gtc.Parent.Element("Id").Value, 
       StartTime = gtc.Attribute("StartTime").Value, 
       TotalSeconds = gtc.Element("TotalTimeSeconds").Value, 
       DistanceMeters = gtc.Element("DistanceMeters").Value, 
       MaximumSpeed = gtc.Element("MaximumSpeed").Value, 
       Calories = gtc.Element("Calories").Value, 
       Intensity = gtc.Element("Intensity").Value, 
       TriggerMethod = gtc.Element("TriggerMethod").Value 
      }; 

dataGridView1.DataSource = query.ToList(); 

當我運行它,我看到標題中出現的DataGridView,但沒有數據。有人能告訴我我要去哪裏嗎?在解決方案中,有人可以告訴我如何讀取心率值?謝謝!

回答

1

變化活動到活動:

from gtc in document.Descendants("Activity").Elements("Lap") 

而對於心率,增加這兩條線靠近你選擇的結尾:

TriggerMethod = gtc.Element("TriggerMethod").Value, 
    AverageHeartRateBpm = gtc.Element("AverageHeartRateBpm").Element("Value").Value, 
    MaximumHeartRateBpm = gtc.Element("MaximumHeartRateBpm").Element("Value").Value 
} 

這裏是我完整的代碼。除了我提到的兩個之外,唯一的變化是刪除xsi:type屬性。

using System; 
using System.Windows.Forms; 
using System.Linq; 
using System.Xml.Linq; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      string xml = @"<Activities> 
    <Activity Sport=""Other""> 
     <Id>2009-12-17T19:53:14Z</Id> 
     <Lap StartTime=""2009-12-17T19:53:14Z""> 
     <TotalTimeSeconds>820.5400000</TotalTimeSeconds> 
     <DistanceMeters>1510.3433838</DistanceMeters> 
     <MaximumSpeed>2.6089859</MaximumSpeed> 
     <Calories>104</Calories> 
     <AverageHeartRateBpm > 
      <Value>128</Value> 
     </AverageHeartRateBpm> 
     <MaximumHeartRateBpm> 
      <Value>139</Value> 
     </MaximumHeartRateBpm> 
     <Intensity>Active</Intensity> 
     <TriggerMethod>Manual</TriggerMethod> 
</Lap> 
</Activity> 
</Activities> 
"; 
      XDocument document = XDocument.Parse(xml); 

      var query = from gtc in document.Descendants("Activity").Elements("Lap") 
         select new 
         { 
          Id = gtc.Parent.Element("Id").Value, 
          StartTime = gtc.Attribute("StartTime").Value, 
          TotalSeconds = gtc.Element("TotalTimeSeconds").Value, 
          DistanceMeters = gtc.Element("DistanceMeters").Value, 
          MaximumSpeed = gtc.Element("MaximumSpeed").Value, 
          Calories = gtc.Element("Calories").Value, 
          Intensity = gtc.Element("Intensity").Value, 
          TriggerMethod = gtc.Element("TriggerMethod").Value, 
          AverageHeartRateBpm = gtc.Element("AverageHeartRateBpm").Element("Value").Value, 
          MaximumHeartRateBpm = gtc.Element("MaximumHeartRateBpm").Element("Value").Value 
         }; 

      dataGridView1.DataSource = query.ToList(); 

     } 
    } 
} 
+0

我做了,仍然沒有來自查詢的數據。 – 2009-12-18 18:36:13

+0

我現在已經發布了我的完整源代碼,以便您可以驗證它是否在新的乾淨項目中工作(只需添加一個按鈕和一個DataGridView,然後連接按鈕的單擊處理程序即可運行)。所以破壞必須由xsi:type屬性引起,或者由其他你不告訴我們的東西引起。 – 2009-12-18 19:03:12

+0

這就像你說的那樣工作,但只有當xml在字符串中。如果我嘗試從文件中讀取它,則查詢是空的。 – 2009-12-18 20:42:20