AspNetCore 2.1 web api передача xml в теле Post запроса

166
03 мая 2019, 14:20

Здравствуйте нужно передать вот такой такой XML документ

<tlist>
    <t>
        <ScheduleId>12254</ScheduleId>
        ...
    </t>
    <t>
        <ScheduleId>333333</ScheduleId>
        ...
    </t>
</tlist>

Добавил поддержку "application/xml" services.AddXmlSerializerFormatters()

[HttpPost]
[Produces("application/xml")]
public void Post([FromBody] ТипДляПриемаDto trainsList)
{
}

Создал тип TrainDto и вернул List через GET запрос, получилось так:

public class TrainDto
{
   public int  ScheduleId { get; set; }
}
<ArrayOfTrainDto xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <TrainDto>
        <ScheduleId>0</ScheduleId>
    </TrainDto>
</ArrayOfTrainDto>

То есть коллекция объектов оборачивается в тег <ArrayOf...> в обработчике по умолчанию.

Подскажите как написать свой обработчик XML или придется принимать XML как строку и самому парсить?

Answer 1

ArrayOfTrainDto у вас вышло исключительно потому что это корневой элемент, и для него неоткуда взять имя кроме как из типа данных. Если вам нужно особое имя - вам нужен особый тип данных.

XML Serializer можно настраивать с помощью атрибутов:

[XmlRoot("tlist")]
public class TrainsDtoContainer
{
    [XmlElement("t")]
    public List<TrainDto> Trains { get; set; } = new List<TrainDto>();
}

Замечу, что отдельный тип-контейнер нужен только для ситуации "массив в корне". Для массивов в других местах контейнер можно создать через XmlArrayAttribute (еще он будет создан по умолчанию если вообще не использовать атрибутов):

[XmlRoot("root")]
public class SomeAnotherDto
{
    [XmlArray("tlist"), XmlArrayItem("t")]
    public List<TrainDto> Trains { get; set; } = new List<TrainDto>();
}

Но, вообще говоря, сложные xml-документы обычно описываются при помощи xsd-схемы. По такой схеме можно автоматически получить все нужные классы с помощью xsd.exe

READ ALSO
Уникальный js скрипт для mysql записи php

Уникальный js скрипт для mysql записи php

Подскажите пожалуйста, есть код:

171
Запрос в запросе или получение данных из двух таблиц mysql php

Запрос в запросе или получение данных из двух таблиц mysql php

Подскажите пожалуйста, как правильнее организовать? Есть код который выводит данные из таблицы:

157
Создание админ панели на Laravel

Создание админ панели на Laravel

Задача: создать на Laravel + Frozennode админ панель для сайта, чтобы никто не мог регистрироватьсяПодкиньте пару примеров или литературу

177