我正在尝试设置一个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
项目被放入容器标签
。有没有办法序列化
episodes
列表,以便容器标签不出现?
事实证明有一种方法,但你必须使用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; } }
凯尔的答案几乎是正确的。你需要[XmlElement("episode")]
才能工作。
据我所知,删除集合类型中的根元素是不可能的。这是Collection Type Serialization的主题,即使有多个选项可以使用CollectionDataContractAttribute
这样的属性来更改集合的序列化,但是没有选项可以删除Serialized集合元素的根。
您可以使用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