2016-06-07 1 views
0

Я пытаюсь прочитать XElement и преобразовать его в десятичную. Sumkwh десятичный и вход:Невозможно преобразовать XElement в десятичный

<detaillinie> 
     <periode>2016-04-27 06:30:00</periode> 
     <kWh>0,35225</kWh> 
     </detaillinie> 
     <detaillinie> 
     <periode>2016-04-27 06:45:00</periode> 
     <kWh>0,35225</kWh> 
     </detaillinie> 
     <detaillinie> 
     <periode>2016-04-27 07:00:00</periode> 
     <kWh>0,17875</kWh> 
</detaillinie> 

Код выглядит следующим образом:

var query = 
       from timeserie in xdoc.Descendants("detaillinie").AsEnumerable() 
       select new TimeSerie 
       { 
        Sumdato = (DateTime)timeserie.Element("periode"), 
        Sumkwh = (decimal)timeserie.Element("kWh") 

       } 

Исключение типа «System.FormatException» произошло в mscorlib.dll, но не был обработан в пользовательском коде

Дополнительная информация: Inputstring был в неправильном формате.

Если я вручную напечатаю Sumkwh = decimal.parse("0,2435") У меня нет ошибки.

Я судимое с Sumkwh = decimal.parse(timeserie.Element("kWh")) это дает сообщение об ошибке «Не удается преобразовать из 'system.xml.linq.xelement' в строку.

Любая помощь, пожалуйста :)

+0

Ваш код не заполнен. – Prathyush

+0

Попробуйте 'Sumkwh = decimal.Parse (timeserie.Element (" kWh "). ToString())' –

+1

Ваш ввод использует ',' как десятичный разделитель, в то время как XML должен писать/читать значения форматированных значений инвариантной культуры. –

ответ

0

timeserie.Element("kWh") является XElement, вы нужно, чтобы захватить это Value.

Использование

decimal.Parse(timeserie.Element("kWh").Value) 
+0

Хм, теперь можно видеть, что это было значение, которое сделало трюк не культурой. Спасибо за помощь. – TBoy3

1

В соответствии с вашим ответом ваш синтаксический анализ вашего query и вашей линии анализа manual отличаются.

в вашей ручной строке вы разбираетесь с decimal.Parse();

так, почему вы не разбираетесь так же, как в своем запросе.

попробовать

Sumkwh = decimal.parse(timeserie.Element("kWh").Value); 

в запросе и не забудьте получить значение из вашего элемента.

+0

Я попробовал это. Я не работал – TBoy3

+0

Что такое ошибка ??? –

+0

Моя ошибка. Это работает. У меня просто не было .value. спасибо – TBoy3

1

В то время как XElementXAttribute) имеют явные операторы, определенные для преобразования их значений, они делают это с использованием инвариантной культуры.

Это работает для вашей метки времени, но десятичная строка не отформатирована правильно и использует запятую как десятичный разделитель.

Если возможно, я предложил бы сериализацию значений в документе XML с использованием инвариантной культуры. Если это невозможно, вам необходимо явно проанализировать значение с использованием соответствующей культуры, то есть

Decimal.Parse(timeserie.Element("kWh").Value, new CultureInfo("de-DE")) 
+0

спасибо. Это была культура, которая отсутствовала. Но почему я могу передать строку «1,234» ?? – TBoy3

+0

@ TBoy3 Инвариантная культура использует '' 'как разделитель групп чисел. Проанализированный номер '1234'. Который делает действительно опасным парсинг десятичных знаков из неизвестных источников. – Dirk