Анализ файла XML с пространством имен и сортировкой значений в порядке убывания - PullRequest
0 голосов
/ 15 июля 2011

Я пытаюсь проанализировать следующий xml-файл: http://reports.ieso.ca/public/DispUnconsHOEP/PUB_DispUnconsHOEP_20110714.xml

Моя цель - получить максимум price с ассоциированным hour и минимум price с ассоциированным hour.

Логика, которую я применяю:Сортируйте IList в порядке убывания на основе price

Извлечь первое значение в IList как максимальное значение, тогда как последнее значение в IList - как минимальное значение.

Мой код:

XNamespace nsPriceHr = "http://www.theIMO.com/schema";
        XDocument xDocument =
            XDocument.Load("http://reports.ieso.ca/public/DispUnconsHOEP/PUB_DispUnconsHOEP_20110714.xml");
        XElement xEl1 = xDocument.Element(nsPriceHr + "IMODocument");
        XElement xEl2 = xEl1.Element(nsPriceHr + "IMODocBody");
        XElement xEl3 = xEl2.Element(nsPriceHr + "HOEPs");

        var data = (from x in xEl3.Descendants(nsPriceHr + "HOEP")
                    orderby x.Element(nsPriceHr + "Price").Value descending 
                    select new HourPrice
                    {
                        Hour = x.Element(nsPriceHr + "Hour").Value,
                        Price = x.Element(nsPriceHr + "Price").Value
                    })
                    .ToList();

Моя проблема: список сортируется не так, как ожидалось.Объект HourPrice, который принимает два значения Hour и Price, имеет оба элемента данных в виде строки.

Я использую C #, .NET 3.5 SP1 и работаю над winforms.Любая помощь приветствуется

1 Ответ

2 голосов
/ 15 июля 2011

Попробуйте использовать System.Convert. В частности, вас могут заинтересовать ToInt32 и ToDecimal. Эти функции принимают строку (или один из различных других типов данных) и преобразуют ее в int или decimal соответственно.

var data = (from x in xEl3.Descendants(nsPriceHr + "HOEP")
    orderby System.Convert.ToDecimal(x.Element(nsPriceHr + "Price").Value) descending 
    select new HourPrice
    {
        Hour = System.Convert.ToInt32(x.Element(nsPriceHr + "Hour").Value),
        Price = System.Convert.ToDecimal(x.Element(nsPriceHr + "Price").Value)
    })
    .ToList();

Edit:

Вот один способ проверить пропущенные значения:

string valueString = x.Element("ElementName").Value;
int value = String.IsNullOrEmpty(valueString) ? 0 : Convert.ToInt32(valueString);

Если ваша проблема в том, что строки не пустые, но и не в правильном формате, вам придется преобразовать их в правильный формат, прежде чем преобразовать. То есть вы должны снять $ со строки, как $6.47.

...