2015-01-16 64 views
0

我是新來的XML,通常用於處理我的API的JSON,所以隨時告訴我是否試圖在這裏重新發明輪子。如何在運行時修改根XML標記?

故事背景:我目前正在開發一個集成,只允許我有一個端點支持多個請求,即搜索,銷售,更新,取消。他們只支持XML,所以我不能使用JSON。我從根XML名稱中確定請求的類型,完成我的工作,然後發回響應。

問題:因爲這是XML,所以我必須返回一個強類型的序列化對象,這使得我無法使用許多自定義類與[XmlRoot(ElementName = "blah")]。因此,我需要在運行時設置根元素名稱以支持我必須發送的不同命名回覆。

我的響應類:

public class Response 
{ 
    public Errors Error { get; set; } 
    public RequestData Request { get; set; } 
    public List<Limo> Limos { get; set; } 
    public string ReservationID { get; set; } 
    public string Status { get; set; } 
    public string ConfNum { get; set; } 
    public string CancelPolicy { get; set; } 
} 

產生的

<?xml version="1.0" encoding="utf-16"?> 
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Error> 
    <ErrorCode /> 
    <ErrorSource /> 
    <ErrorDescription /> 
    </Error> 
    <Request> 
    <ServiceType>300</ServiceType> 
    <StartDateTime>2015-09-30T09:00:00</StartDateTime> 
    <NumPassengers>1</NumPassengers> 
    <VehicleType>100</VehicleType> 
    </Request> 
    <Limos /> 
</Response> 

的響應基本上,我需要能夠改變<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><SearchReply><SellReply><UpdateReply>,或<CancelReply>根據需要最終像這樣的東西

<?xml version="1.0" encoding="utf-16"?> 
<SearchReply> 
    <Error> 
    <ErrorCode /> 
    <ErrorSource /> 
    <ErrorDescription /> 
    </Error> 
    <Request> 
    <ServiceType>300</ServiceType> 
    <StartDateTime>2015-09-30T09:00:00</StartDateTime> 
    <NumPassengers>1</NumPassengers> 
    <VehicleType>100</VehicleType> 
    </Request> 
    <Limos /> 
</SearchReply> 
+1

我能想到的一種方式就是定義從Response類派生的新類SearchReply並將其用於響應。 –

+0

@PankajKapare謝謝。我會給你一個機會,看看會發生什麼。 – Owen

+0

雖然不確定,但您可能需要在應用程序啓動事件中使用xmlformatter註冊此新類型,如下所示var SearchReplyXmlFormatter = GlobalConfiguration.Configuration.Formatters.XmlFormatter; SearchReplyXmlFormatter .SetSerializer (new XmlSerializer(typeof(SearchReply))); –

回答

0

這是一個多部分修復程序。我對如何讓這個工作起作用並不滿意,但它的工作原理還是不錯的。我可以重構,因爲我在整個項目中瞭解更多。

根據Pankaj的建議: 我使用Response作爲基礎實現派生類。這還不夠,因爲我的對象仍然是Response類,但是這是必要的,因爲我需要爲每次調用分別安裝一個類,以完全實現下一步。

public class IntegrationSearchReply : Response 

然後,我裝飾派生類來指定根元素名稱。

[XmlRoot(ElementName = "SearchReply", Namespace = "")] 
public class IntegrationSearchReply : Response 

這仍然沒有工作,所以我開始研究手動創建我的迴應。我發現的最後一步是將我的控制器方法從返回Response更改爲返回HttpResponseMessage。這使我能夠將序列化對象與XmlSerializer並將HttpResponseMessage內容設置爲序列化對象。

謝謝你的幫助Pankaj!