2013-06-03 30 views
6

Tôi đang tạo nguồn cấp dữ liệu xml của các sản phẩm cần khớp chính xác với sơ đồ khách hàng.Cách xác định thuộc tính xml bằng cách sử dụng api web và mô hình ràng buộc

Tôi đang sử dụng api web. Tôi muốn thuộc tính extractDate là một thuộc tính. Đoạn mã sau xuất ra phần trích xuất là một phần tử không thuộc tính

public Feed GetProducts() 
    { 
      var feed = new Feed() 
      { 
       extractDate = "extractDate", 
       incremental = true, 
       name = "name", 
       Brands = GetBrands(), 
       Categories = GetCategories(), 
       Products = GetProducts() 
      }; 


     return feed; 
    } 

Đây là nguồn cấp dữ liệu mô hình của tôi. Lưu ý những điều sau đây dường như không để biến phần tử vào một thuộc tính

[XmlAttribute(AttributeName = "extractDate")] 
public class Feed 
{ 
    [XmlAttribute(AttributeName = "extractDate")] //attribute is ignored 
    public string extractDate { get; set; } 
    public bool incremental { get; set; } 
    public string name { get; set; } 
    public List<Brand> Brands { get; set; } 
    public List<Category> Categories { get; set; } 
    public List<Product> Products { get; set; } 
} 

Làm thế nào để đầu ra i

<feed extractDate="2012/01/01" 

// other logic 

/> 
+0

thể trùng lặp của [Làm thế nào để ràng buộc XML Attributes với mô hình hành động trong MVC Web API?] (Http://stackoverflow.com/questions/10641426/how-do-i-bind-xml-attributes-to-the-action-model-in-mvc-web-api) –

+0

Bài đăng trên dường như có liên quan đến bản phát hành beta. Tôi đã đọc điều này nhưng không chắc chắn nó có thể áp dụng ngay bây giờ. Linh cảm của tôi là tôi đang thiếu một cái gì đó rõ ràng là – frosty

Trả lời

10

Web API theo mặc định sử dụng DataContractSerializer trong XmlMediaTypeFormatter và có lẽ đó là lý do bạn không nhìn thấy đồ trang trí thuộc tính của bạn có hiệu lực. Bạn đã bật XmlSerializer trên XmlMediaTypeFormatter để xem kết quả mong đợi của mình chưa?

config.Formatters.XmlFormatter.UseXmlSerializer = true;

Ngoài ra, bạn có thể thiết lập XmlSerializer chỉ với nhiều loại cụ thể quá sử dụng api sau:

config.Formatters.XmlFormatter.SetSerializer<>

+0

Cảm ơn, điều này đã làm việc. Tôi đã sử dụng mã Kristof trong asax toàn cầu – frosty

3

Sửa
Managed để mô phỏng vấn đề của bạn với một dự án trống và trả lời Kiran dường như làm lừa.
Chỉ cần thêm dòng này trong điều khiển của bạn (cho mục đích thử nghiệm, nó có lẽ phải ở trong global.asax của bạn)

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true; 

Bạn có đủ [XmlRoot] trên đầu trang của lớp học của bạn hoặc là nó thiếu?
Không chắc chắn thuộc tính sẽ hoạt động mà không có trình trang trí lớp xml.
Một kiểm tra sanity đơn giản mà bạn có thể làm là sắp xếp từng lớp mà không cần api web liên quan để đảm bảo rằng nó không có gì ngớ ngẩn nhưng thực sự liên quan đến api trên web.

+0

cảm ơn, rất hữu ích. Vì vậy, tôi đã thêm [XmlRoot] phía trên tên lớp của tôi mà không có thay đổi tôi vừa thử nghiệm bằng cách sử dụng xml.serializer và các thuộc tính là chính xác trong phiên bản này. Có cách nào tôi có thể xuất ra phiên bản serialize từ api web. – frosty

+0

một lần nữa cảm ơn bạn đã cập nhật. – frosty

+0

Dòng mã này đã khắc phục sự cố tôi gặp phải với Web Api "bỏ qua" XmlRootAttribute và XmlTypeAttribute của các loại phức tạp của tôi đang được sử dụng làm tham số và trả về. – SixOThree

0

Làm thế nào về điều này:

[XmlRoot("feed")] 
public class Feed 
{ 
    [XmlAttribute(AttributeName = "extractDate")] 
    public string extractDate { get; set; } 

    public bool incremental { get; set; } 
    public string name { get; set; } 
    public List<Brand> Brands { get; set; } 
    public List<Category> Categories { get; set; } 
    public List<Product> Products { get; set; } 
} 
+0

Xin chào, cảm ơn vì bình luận của bạn. Tôi đã thử điều này. Nhưng vẫn không ảnh hưởng đến đầu ra. công việc này là dành cho bạn? – frosty

+0

Nó thực sự. Nó có thể là ngu ngốc, nhưng hãy thử đặt ** [XmlElement] ** lên trên các trường khác ... – pobed2

+0

và đừng quên GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true; – tartakynov

Các vấn đề liên quan