2009-12-18 99 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