Asp.net web api 序列化不带根标记的集合
我正在尝试设置一个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;} }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
我遇到的问题是
插曲
项目被放入容器标签中。有没有办法序列化剧集
列表,使容器标记不会出现?据我所知,删除集合类型中的根元素是不可能的。这是的主题,即使有多个选项可以更改集合如何使用属性(如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; }
}