Как преобразовать данные IFormfile XML в список. Net Core - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь отправить файл XML из моего приложения Angular на мой контроллер ядра ASP. Net. Я хотел бы, чтобы контроллер получил файл и затем десериализовал его в строго типизированный список объектов. Какой правильный способ go по этому поводу? В настоящее время я получаю сообщение об ошибке при десериализации файла, в котором говорится, что данные на уровне root недействительны. Строка 1, позиция 1 '. Вот что я пробовал до сих пор.

Контроллер:

    [HttpPost("reconciliation")]
    public async Task<IActionResult> SetReconciliation(IFormFile file)
    {
        List<ReconciliationExportCsv> records = new List<ReconciliationExportCsv>();
        XmlSerializer serializer = new XmlSerializer(typeof(List<ReconciliationExportCsv>));

        using (var reader = new StreamReader(file.OpenReadStream()))
        {
           records = (List<ReconciliationExportCsv>)serializer.Deserialize(reader);
        }

        var submitted = await _service.UploadReconciliationData(records);

        return Ok();
    }
}

Модель:

public class ReconciliationExportCsv
{
    public string or1 { get; set; }
    public string exitStatus { get; set; }
    public string vendorState { get; set; }
   }
}

CSV:

enter image description here

1 Ответ

0 голосов
/ 23 апреля 2020

Я рекомендую вам read StreamReader, а затем преобразовать их в XElement тип.

public async Task<IActionResult> SetReconciliation(IFormFile file)
        {
            List<ReconciliationExportCsv> records = new List<ReconciliationExportCsv>(); 
            using (var reader = new StreamReader(file.OpenReadStream()))
            {
                var csvFile = await reader.ReadToEndAsync();
                string[] filelines = csvFile.Split(new string[] { "\r\n" }, StringSplitOptions.None).Skip(1).ToArray();
                filelines = filelines.Take(filelines.Count() - 1).ToArray();
                var xml = new XElement("TopElement",
   filelines.Select(line => new XElement("CsvItem",
      line.Split(',').Select((column, index) => new XElement("Column" + index, column)))));

                records = xml.Descendants("CsvItem").Select(item => new ReconciliationExportCsv()
                {
                    or1 = (string)item.Element("Column0"),
                    exitStatus = (string)item.Element("Column1"),
                    vendorState = (string)item.Element("Column2")
                }).ToList();
            }

           var submitted = await _service.UploadReconciliationData(records);

            return Ok();
        }
...