如何在运行时修改根XML标记?

时间:2015-01-16 17:00:00

标签: xml asp.net-web-api2 xmlserializer

我是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>

1 个答案:

答案 0 :(得分:0)

这是一个多部分修复。我对如何开始工作并不满意,但它确实很有效。我可以重构,因为我在整个项目中学到了更多。

根据Pankaj的建议: 我使用Response作为基础实现了派生类。这还不够,因为我的对象仍然获得基类Response类,但是因为我需要为每个调用单独的类来完全实现下一步,所以这是必要的。

public class IntegrationSearchReply : Response

然后,我修饰了派生类以指定根元素名称。

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

这仍然没有用,所以我开始研究手动创建我的回复。我发现的最后一步是将控制器方法从返回Response更改为返回HttpResponseMessage。这使我能够使用XmlSerializer序列化对象,并将HttpResponseMessage内容设置为序列化对象。

感谢您的帮助Pankaj!