2016-03-18 3 views
0

У меня есть проблема, когда я пытаюсь читать XML-файл, который имеет десятичные значения, как 24.5478785 - это возвращает ошибку:Невозможно читать десятичных чисел из XML

There is error in XML document

Может кто-то пожалуйста, сообщите, почему это происходит? Дробная часть в файле выглядит следующим образом: <interval>22,555555</interval>

Мой код:

private void OpenFileXml(bool runIt, string file) 
{ 
    //Get data from XML file 
    XmlSerializer ser = new XmlSerializer(typeof(ActionsEntry)); 
    using (FileStream fs = System.IO.File.Open(file, FileMode.Open)) 
    { 
     try 
     { 
      ActionsEntry entry = (ActionsEntry)ser.Deserialize(fs); 
      lvActions.Items.Clear(); 
      foreach (ActionsEntryAction ae in entry.Action) 
      { 
       string point = ae.X.ToString() + "," + ae.Y.ToString(); 
       string interval = (ae.interval).ToString("F6"); 
       ListViewItem lvi = new ListViewItem(new string[] { point, ((ClickType)(ae.Type)).ToString(), interval, ae.Text }); 
       ActionEntry acion = new ActionEntry(ae.X, ae.Y, ae.Text, ae.interval, (ClickType)(ae.Type)); 
       lvi.Tag = acion; 
       lvActions.Items.Add(lvi); 
      } 

      if (runIt) 
      { 
       btnStart.PerformClick(); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Clicer", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 
} 

EDIT

XML файл: enter image description here

XML:

<?xml version="1.0" encoding="utf-8"?><ActionsEntry xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<Action> 
<X>824</X> 
<Y>456</Y> 
<Text /> 
<interval>22,555555</interval> 
<Type>0</Type> 
</Action> 
</ActionsEntry> 
+0

Пытались ли вы изменить CultureInfo? –

+0

Не знаю, что это такое ... – JustinasT

+2

Посмотрите на этот вопрос: http://stackoverflow.com/questions/17437946/xml-deserialization-crashes-on-decimal-parse-due-to -форматирование. Думаю, у него есть ответ, который вы ищете. –

ответ

0

XML-сериализатор использует стандартный формат для сериализации/десериализации поплавка/даты, и на самом деле он не заботится о CultureInfo. эта проблема связана с преобразованием поплавка в потоке cultureInfo.

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

System.Globalization.CultureInfo customCulture = (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone(); 
customCulture.NumberFormat.NumberDecimalSeparator = ","; 

System.Threading.Thread.CurrentThread.CurrentCulture = customCulture; 

либо либо вы можете реализовать пользовательский Сериализатор. вот хорошая статья

Injecting XML Serialization for formatting decimal properties

другого варианта изменить ActionsEntry класс и реализовать свойство обертки для преобразования interval и игнорировать thread's cultureInfo, чтобы решить эту проблему.

public class ActionsEntry 
{ 
    public Action Action { get; set; } 
} 

public class Action 
{ 
    public int X { get; set; } 

    public int Y { get; set; } 

    public string Text { get; set; } 

    [XmlIgnore] 
    public float interval { get; set; } 

    private string _intervalString; 
    [XmlElement("interval")] 
    public string IntervalString 
    { 
     get 
     { 
      return _intervalString; 
     } 
     set 
     { 
      _intervalString = value; 
      if (!string.IsNullOrEmpty(value)) 
      { 
       interval = float.Parse(value, CultureInfo.InvariantCulture); 
      } 
     } 
    } 

    public int Type { get; set; } 
} 
+0

Не повезло, такая же ошибка. – JustinasT

+0

, в какой строке это вызывает исключение? где вы добавили этот код? – esiprogrammer

+0

Вы пытались изменить элемент xml на ' 22.555555' replace ',' '' 'это работает так или нет? – esiprogrammer

0

You have not provided the structure of your Action and ActionsEntry classes, so I went ahead with following assumptions

public class ActionsEntry 
    { 
     public ActionsEntry() { Actions = new List<Action>(); } 
     [XmlElement("Action")] 
     public List<Action> Actions { get; set; } 

    } 

    public class Action 
    { 
     public int X { get; set; } 
     public int Y { get; set; } 

     public string Text { get; set; } 

     [XmlElement("interval")] 
     public string Interval { get; set; } 
     public int Type { get; set; } 

    } 

Затем в течение цикла я попытался:

ActionsEntry entry = (ActionsEntry)ser.Deserialize(fs); 
foreach (var action in entry.Actions) 
{ 
    string interval = action.Interval.Replace(',', '.'); 
    decimal intvrl = Decimal.Parse(interval); 
    Console.WriteLine(intvrl); 
}