LINQ to XML: чтение XML в C # - PullRequest
       13

LINQ to XML: чтение XML в C #

0 голосов
/ 18 декабря 2009

Я пытаюсь прочитать файл XML с помощью LINQ. У меня не было проблем с чтением и синтаксическим анализом простых 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 Ответ

1 голос
/ 18 декабря 2009

Изменить активность на активность:

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();

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...