Сериализация коллекции без корневого тега
Я пытаюсь настроить конечную точку Web API, которая требует особого требования, чтобы формат XML был похож на это:
<Широковещательный> <Имя> имя> <Описание> описание> <Эпизод> <Название> название> Эпизод> <Эпизод> <Название> название> Эпизод>... Широковещательный>
Мои модели выглядят так:
[DataContract] трансляция общественного класса { [DataMember] публичное имя строки {get; задавать; } [DataMember] публичное описание строки {get; задавать; } [DataMember] общедоступный список<эпизод> эпизодов {get; задавать; } } [DataContract] публичный класс { [DataMember] публичная строка title {get; задавать; } }
Проблема, с которой я сталкиваюсь, заключается в том, что episode
элементы помещаются в контейнерный тег <эпизоды>. Есть ли способ сериализации episodes
список, чтобы тег контейнера не появлялся?
3 ответа
Оказывается, есть способ сделать это, но вы должны использовать XmlSerializer
, Для этого добавьте следующую строку в ваш WebApiConfig.cs
config.Formatters.XmlFormatter.UseXmlSerializer = true;
Затем добавьте [XmlElement]
Приписывать любые коллекции, у которых нет необходимости иметь корневой тег. Если вы хотите использовать корневой тег, используйте [XmlArray]
, Итак, в моем примере выше:
[XmlType] трансляция общественного класса { [XmlElement] публичное имя строки {get; задавать; } [XmlElement] публичное описание строки {get; задавать; } [XmlElement] // может использовать [XmlArray], если я хочу корневой тег Публичный список эпизодов {get; задавать; } } [XmlType] публичный класс { [XmlElement] публичная строка title {get; задавать; } }
Ответ Кайла почти правильный. Тебе нужно [XmlElement("episode")]
чтобы это работало.
Насколько я знаю, удаление корневого элемента в типе коллекции невозможно. Это является предметом сериализации типов коллекций, и хотя существует несколько опций для изменения порядка сериализации коллекций с использованием таких атрибутов, как CollectionDataContractAttribute
нет возможности удалить корень для элемента Serialized collection.
Вы можете использовать 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