2011-12-11 38 views
7

tôi đang cố gắng để deserialize một đối tượng Movie từ một chuỗi xml "Đức":XML-Deserialization giá trị đôi với phân cách thập phân Đức trong C#

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); 

đây lớp Movie để tham khảo:

[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(); 
    } 

} 

miễn là tôi đặt <price> làm 1.99 nó hoạt động hoàn hảo. khi tôi sử dụng dấu phân cách số thập phân Đức của Đức 1,99, nó không hoạt động nữa.

xin vui lòng tư vấn

+3

Bạn có lược đồ được liên kết không? Trong thông số XML-Schema, đôi cần được biểu diễn bằng a. http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/#decimal, vì vậy hành vi này là do thiết kế. Bạn có thể thay thế loại Giá bằng chuỗi và sau đó có một thuộc tính không có giá trị Realprice sử dụng Double.Parse với chuỗi định dạng appropiate – rene

+0

xml được cung cấp cho tôi ở định dạng này và tôi không thể làm gì về điều đó. nhưng cảm ơn bạn đã trả lời! –

+1

Lưu ý quan trọng: giá trị tiền tệ hầu như luôn luôn là số thập phân, chứ không phải gấp đôi –

Trả lời

7

Như đã lưu ý, đó không phải là cách hợp lệ để thể hiện một giá trị số trong XML. Nó là tốt cho một chuỗi mặc dù. Bạn có thể làm:

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

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

đâu "..." đại diện cho bạn lựa chọn format specifier và CultureInfo

+0

trong trường hợp của tôi CultureInfo.GetCultureInfo ("de-DE") .NumberFormat –

1

Như đã đề cập, XmlSerializer không phải là công cụ phù hợp với bạn, bởi vì nó sẽ sử dụng các đặc điểm kỹ thuật schema datatype W3C.

Các giải pháp thay thế bao gồm sử dụng tệp XSLT để chuyển đổi XML đầu vào trước khi deserialisation hoặc sử dụng một công cụ khác chẳng hạn như LINQ to XML.

+0

Bạn có thể cho mẫu không? –

+2

http://stackoverflow.com/questions/647991/summing-numbers-with-comma-as-decimal-separator-in-xslt có thể cung cấp cho bạn một số ý tưởng để dịch – devdigital

3

Trong XML Schema spec một double/decimal cần phải được trình bày với một . nên hành vi này là do thiết kế .

Bạn có thể thay thế loại Giá bằng chuỗi và sau đó có thuộc tính không được tuần tự Realprice sử dụng Double.TryParse với CultureInfo hoặc NumberFormatInfo thích hợp.

[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; 
       } 
     } 
Các vấn đề liên quan