2016-11-01 17 views
5

Tôi đã được yêu cầu cung cấp các tài liệu XML sau đây từ một thiết bị đầu cuối http, chính xác thích: -Di xmlns: i và xmlns từ WebAPI

<?xml version="1.0" encoding="utf-8"?> 
    <XMLFile xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<SalesOrders> 
... 
</SalesOrders> 

Tuy nhiên Web API spits ra

<?xml version="1.0" encoding="utf-8"?> 
<XMLFile xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://schemas.datacontract.org/2004/07/White.Label.Ordering.Infrastructure.Data.Queries.Export"> 
    <SalesOrders> 
     ... 
    </SalesOrders> 

tôi có google xung quanh và thử các bản sửa lỗi khác nhau nhưng không có kết quả, mô hình của tôi trông giống như

[DataContract] 
public class XMLFile 
{ 
    [DataMember] 
    public List<SalesOrder> SalesOrders { get; set; } 
} 

[DataContract] 
public class SalesOrder 
{ 
    [DataMember(Order = 1)] 
    public string OrderNumber { get; set; } 
} 

và tôi thiết lập lools như này

public static void Register(HttpConfiguration config) 
    { 
     config.Formatters.XmlFormatter.WriterSettings.OmitXmlDeclaration = false; 
     ... 

    } 

Làm thế nào tôi có thể ngưng xmlns:ixmlns và thay thế bằng xmlns:xsdxmlns:xsi?

Tôi biết đây là một câu hỏi không tốt vì nó không quan trọng nhưng khách hàng tiêu thụ của tôi đang bị chặn.

+0

có thể trùng lặp của http://stackoverflow.com/questions/12590801/remove-namespace-in-xml-from-asp-net-web-api ? –

+0

Không thấy và đã thử điều đó, muốn nó là – Rippo

Trả lời

2

Nếu bạn cần XML của bạn trông giống hệt một cái gì đó, thì bạn có thể tốt hơn với XmlSerializer. DataContractSerializer không cung cấp cho bạn cùng một mức độ kiểm soát vì nó khá giả định bạn sử dụng nó trên cả hai đầu.

Điều đó nói rằng, tôi sẽ tưởng tượng khách hàng tiêu thụ của bạn là 'barfing' vì hai trường hợp có ngữ nghĩa khác nhau. Việc đầu tiên có một không gian tên mặc định rỗng, và thứ hai có một không gian tên mặc định là http://schemas.datacontract.org/2004/07/White.Label.Ordering.Infrastructure.Data.Queries.Export.

Đây phải là điều duy nhất bạn cần sửa, bạn có thể thực hiện việc này bằng cách đặt không gian tên của DataContract.

[DataContract(Namespace="")] 
public class XMLFile 
{ 
    [DataMember] 
    public List<SalesOrder> SalesOrders { get; set; } 
} 

[DataContract(Namespace="")] 
public class SalesOrder 
{ 
    [DataMember(Order = 1)] 
    public string OrderNumber { get; set; } 
} 

này sẽ cung cấp cho bạn:

<?xml version="1.0" encoding="utf-8"?> 
<XMLFile xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <SalesOrders> 
     ... 
    </SalesOrders> 
</XMLFile> 
+0

Cảm ơn, tôi đã thử điều này trên lớp XMLFile, nhưng không thêm Namesspace vào tất cả các không gian tên lớp cơ bản. Sẽ yêu cầu khách hàng thử lại. Cảm ơn – Rippo

+0

Ah crap khách hàng tiêu thụ vẫn còn barfing. Các hệ thống xml cổ xưa ngu ngốc, có vẻ như tôi cần phải đi xuống đường dẫn XMLSerializer – Rippo

+0

Đã giảm XMLSerializer thay vào đó, có nghĩa là tôi không thể sử dụng webapi nữa để chứng minh tương lai nó cho thương lượng kiểu nội dung. Cảm ơn – Rippo

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