Сериализация коллекции без корневого тега

Я пытаюсь настроить конечную точку 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


Другие вопросы по тегам