XML-десериализация двойного значения с немецким десятичным разделителем в C # - PullRequest
8 голосов
/ 11 декабря 2011

Я пытаюсь десериализовать объект Movie из "немецкой" строки XML:

string inputString = "<?xml version=\"1.0\"?>"
    + "<movie title=\"Great Bollywood Stuff\">"
    + "<rating>5</rating>"
    + "<price>1,99</price>" // <-- Price with German decimal separator!
    + "</movie>";

XmlSerializer movieSerializer = new XmlSerializer(typeof(Movie));
Movie inputMovie;

using (StringReader sr = new StringReader(inputString))
{
    inputMovie = (Movie)movieSerializer.Deserialize(sr);
}
System.Console.WriteLine(inputMovie);

здесь класс Movie для справки:

[XmlRoot("movie")]
public class Movie
{

    [XmlAttribute("title")]
    public string Title { get; set; }

    [XmlElement("rating")]
    public int Rating { get; set; }

    [XmlElement("price")]
    public double Price { get; set; }

    public Movie()
    {

    }

    public Movie(string title, int rating, double price)
    {
        this.Title = title;
        this.Rating = rating;
        this.Price = price;
    }

    public override string ToString()
    {
        StringBuilder sb = new StringBuilder("Movie ");
        sb.Append("[Title=").Append(this.Title);
        sb.Append(", Rating=").Append(this.Rating);
        sb.Append(", Price=").Append(this.Price);
        sb.Append("]");

        return sb.ToString();
    }

}

Пока я ставлю <price> как 1.99, он работает отлично. когда я использую немецкий немецкий десятичный разделитель 1,99, он больше не работает.

пожалуйста, совет

Ответы [ 3 ]

9 голосов
/ 11 декабря 2011

Как уже отмечалось, это просто недопустимый способ представления числового значения в XML.Это хорошо для строки, хотя.Вы можете сделать:

[XmlIgnore]
public decimal Price {get;set;}

[XmlElement("price")]
public string PriceFormatted {
    get { return Price.ToString(...); }
    set { Price = decimal.Parse(value, ...); } 
}

Где "..." представляет ваш выбор спецификатора формата и CultureInfo

4 голосов
/ 11 декабря 2011

В спецификации XML-схемы значение double / decimal должно быть представлено с помощью ., поэтому такое поведение является заданным.

Вы можете заменить тип Price на строку, а затем иметь несериализованное свойство Realprice, которое использует Double.TryParse с соответствующим CultureInfo или NumberFormatInfo.

[XmlRoot("movie")] 
public class Movie {     
      [XmlElement("price")]     
      public string Price { get; set; }  

      [XmlIgnore]
      public double RealPrice { 
         get { 
               double resultprice;
               if (!Double.TryParse(
                  Price, 
                  NumberStyles.Any, 
                  new CultureInfo("de-DE"),
                  resultprice)) throw new ArgumentException("price");
               // resultprice is now parsed, if not an exception is thrown
               return resultprice;
              } 
       }
1 голос
/ 11 декабря 2011

Как уже упоминалось, XmlSerializer не подходит вам, поскольку он будет использовать спецификацию типа данных схемы W3C.

Альтернативные решения включают использование файла XSLT для преобразования входного XML перед десериализацией илииспользуя другой инструмент, такой как Linq to XML.

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