我是XML的新手,通常为我的API处理过JSON,所以请随时告诉我,我是否试图在这里重新发明轮子。
背景故事:我目前正致力于集成,只允许我有一个端点支持多个请求,即搜索,销售,更新,取消。它们只支持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>
答案 0 :(得分:0)
这是一个多部分修复。我对如何开始工作并不满意,但它确实很有效。我可以重构,因为我在整个项目中学到了更多。
根据Pankaj的建议:
我使用Response
作为基础实现了派生类。这还不够,因为我的对象仍然获得基类Response
类,但是因为我需要为每个调用单独的类来完全实现下一步,所以这是必要的。
public class IntegrationSearchReply : Response
然后,我修饰了派生类以指定根元素名称。
[XmlRoot(ElementName = "SearchReply", Namespace = "")]
public class IntegrationSearchReply : Response
这仍然没有用,所以我开始研究手动创建我的回复。我发现的最后一步是将控制器方法从返回Response
更改为返回HttpResponseMessage
。这使我能够使用XmlSerializer
序列化对象,并将HttpResponseMessage
内容设置为序列化对象。
感谢您的帮助Pankaj!