Asp.net web api 序列化不带根标记的集合

Asp.net web api 序列化不带根标记的集合,asp.net-web-api,xml-serialization,asp.net-web-api2,Asp.net Web Api,Xml Serialization,Asp.net Web Api2,我正在尝试设置一个Web API端点,该端点有一个特定的要求,即XML格式类似于以下内容: <broadcast> <name></name> <description></description> <episode> <title></title> </episode> <episode> <titl

我正在尝试设置一个Web API端点,该端点有一个特定的要求,即XML格式类似于以下内容:

<broadcast> <name></name> <description></description> <episode> <title></title> </episode> <episode> <title></title> </episode> ... </broadcast> </标题> </标题> ... 我的模型是这样的:

[DataContract] public class broadcast { [DataMember] public string name { get; set; } [DataMember] public string description { get; set; } [DataMember] public List<episode> episodes { get; set; } } [DataContract] public class episode { [DataMember] public string title { get; set; } } [数据合同] 公共广播 { [数据成员] 公共字符串名称{get;set;} [数据成员] 公共字符串说明{get;set;} [数据成员] 公共列表集{get;set;} } [数据合同] 公共课插曲 { [数据成员] 公共字符串标题{get;set;} }
我遇到的问题是
插曲
项目被放入容器标签中。有没有办法序列化
剧集
列表,使容器标记不会出现?

据我所知,删除集合类型中的根元素是不可能的。这是的主题,即使有多个选项可以更改集合如何使用属性(如
CollectionDataContractAttribute
)进行序列化,也没有删除序列化集合元素根的选项

事实证明有一种方法可以做到这一点,但您必须使用
XmlSerializer
。要执行此操作,请将以下行添加到WebApiConfig.cs

config.Formatters.XmlFormatter.UseXmlSerializer = true;
然后将
[xmlement]
属性添加到任何不需要根标记的集合中。如果希望有根标记,请使用
[XmlArray]
。在我上面的例子中:

[XmlType] public class broadcast { [XmlElement] public string name { get; set; } [XmlElement] public string description { get; set; } [XmlElement] // could use [XmlArray] if I want a root tag public List episodes { get; set; } } [XmlType] public class episode { [XmlElement] public string title { get; set; } } [XmlType] 公共广播 { [XmlElement] 公共字符串名称{get;set;} [XmlElement] 公共字符串说明{get;set;} [XmlElement]//如果需要根标记,可以使用[XmlArray] 公共列表集{get;set;} } [XmlType] 公共课插曲 { [XmlElement] 公共字符串标题{get;set;} }
凯尔的回答几乎是正确的。您需要
[xmlement(“插曲”)]
才能使其工作。

您可以使用MessageContract代替DataContract。消息契约描述了向服务发送和从服务发送的SOAP消息的结构,使您能够检查和控制SOAP头和正文中的大部分细节:


  [MessageContract]
  public class broadcast
  {
      [MessageBodyMember]
      public string name { get; set; }
      [MessageBodyMember]
      public string description { get; set; }
      [MessageBodyMember]
      public List<episode> episodes { get; set; }
    }