我尝试设置一个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; } }
我遇到的问题是episode
项目被放入容器标记&lt; episodes&gt;。有没有办法序列化episodes
列表,以便容器标签不会出现?
答案 0 :(得分:1)
事实证明有一种方法可以做到这一点,但你必须使用XmlSerializer
。为此,请将以下行添加到WebApiConfig.cs
config.Formatters.XmlFormatter.UseXmlSerializer = true;
然后将[XmlElement]
属性添加到您没有根标记的任何集合中。如果要使用根标记,请使用[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; } }
答案 1 :(得分:1)
凯尔的答案几乎是正确的。您需要[XmlElement("episode")]
才能实现此目的。
答案 2 :(得分:0)
据我所知,删除集合类型中的根元素是不可能的。这是Collection Type Serialization的主题,即使有多个选项可以使用CollectionDataContractAttribute
之类的属性来更改集合的序列化,但是没有选项可以删除Serialized集合元素的根。
答案 3 :(得分:0)
您可以使用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; }
}
在这里您可以找到更多的信息和详细信息-> https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/using-message-contracts