нужна помощь с использованием LINQ: XML для создания экземпляра класса - PullRequest
1 голос
/ 03 апреля 2011

У меня есть класс, который определяет метеорологические измерения с помощью API.Я создал классы для хранения этих измерений в файле XML.Мне удалось записать в файл XML, но я не могу читать из него.Мне нужно иметь возможность прочитать данные, затем создать экземпляр класса измерений через конструктор, а затем добавить эти экземпляры в список. Вот код для конструктора измерений

  public Measurement(string longit, string latitud, string cty, string pcode, DateTime dte, decimal huy, decimal pre, string windDir, int windSp) : base(longit, latitud, cty,pcode)
    {

        dte = date;
        huy = humidity;
        pre = precipitation;           
        windDir = windDirection;
        windSp = windSpeed;
    }

, а вот примерXML-файл

<Measurement>
<longitude>-76.2858726</longitude>
<latitude>36.8507689</latitude>
<city>Thetford</city>
<postcode>IP24 1ED</postcode>
<date>01/04/2011</date>
<windDirection>SE</windDirection>
<windSpeed>8</windSpeed>
<humidity>2.6</humidity>
<precipitation>0.0</precipitation>
</Measurement>

А вот метод, который я написал для чтения файла и создания экземпляра класса Measurement.Я не получаю никаких ошибок, однако не смог создать Список <>

public List<Measurement> GetList()
    {
        List<Measurement> measurements = new List<Measurement>();
        XDocument doc = XDocument.Load(@"C:\Users\Sonya\Documents\Visual Studio 2010\Projects\WeatherAPI\WeatherAPI\measurement_store.xml");
        XElement root = doc.Root;

     var d = (from s in root.Descendants("Measurement")
                 select new Measurement
                 {
                     Longitude = s.Element("longitude").Value,
                     Latitude = s.Element("latitude").Value,
                     City = s.Element("city").Value,
                     Postcode = s.Element("postcode").Value,
                     Date = DateTime.Parse(s.Element("date").Value),
                     Humidity = decimal.Parse(s.Element("humidity").Value),
                     Precipitation = decimal.Parse(s.Element("precipitation").Value),
                     WindSpeed = Convert.ToInt32(s.Element("windSpeed").Value),
                     WindDirection = s.Element("windDirection").Value,

                 }).ToList();


     d.ForEach(measurements.Add);

        return measurements;
    }//end GetList()

Я также написал другой метод, немного другого формата.эти вопросы кажутся глупыми, я ОЧЕНЬ новичок в LINQ и XML, поэтому очень медленно нахожу свой путь ... любая помощь очень ценится!Консольное приложение вызывает этот метод для тестирования и не производит ничего, кроме WeatherAPI.Measurement WeatherAPI.Measurement

Помощь?спасибо!

1 Ответ

1 голос
/ 03 апреля 2011

В целом ваш код выглядит нормально. Как отметил в своем комментарии Джон Скит, вам не нужно беспокоиться о добавлении каждого элемента в список - вы можете просто вернуть результат запроса после вызова .ToList().

Скорее всего, что-то не так с вашим XML-файлом, или вы неправильно его читаете.

Если ваш xml-файл действительно просто:

<Measurement>
    <longitude>-76.2858726</longitude>
    <latitude>36.8507689</latitude>
    <city>Thetford</city>
</Measurement>

Тогда ваш код не будет работать, потому что root файла xml равен Measurement . Поэтому, позвонив по номеру doc.Root.Descendants("Measurement"), вы получите 0 результатов. Вместо этого ваш XML-файл должен иметь уникальный корневой элемент, например:

<root>
    <Measurement>
        <longitude>-76.2858726</longitude>
        <latitude>36.8507689</latitude>
        <city>Thetford</city>
    </Measurement>
    <Measurement>
        <longitude>-71.2858726</longitude>
        <latitude>32.1507689</latitude>
        <city>Other City</city>
    </Measurement>
</root>

Кроме того, вам не нужно беспокоиться о получении Root документа xml. Если вам нужно только найти элементы с именем Measurement, просто скажите doc.Descendants("Measurement").

Попробуйте этот код с приведенным выше XML-файлом:

void Main()
{
    var measurements = GetMeasurements(@"C:\path\to\file\measurements.xml");
}

public List<Measurement> GetMeasurements(string path)
{
    XDocument doc = XDocument.Load(path);

    return (from s in doc.Descendants("Measurement")
            select new Measurement
            {
                 Longitude = Convert.ToDecimal(s.Element("longitude").Value),
                 Latitude = Convert.ToDecimal(s.Element("latitude").Value),
                 City = s.Element("city").Value,
            }).ToList();
}

public class Measurement
{
    public decimal Longitude { get; set; }
    public decimal Latitude { get; set; }
    public string City { get; set; }
}

Когда я запускаю его в LINQPad, я получаю следующий результат:

sample result

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