如何在.Net Core中把IFormfile的XML数据转换为列表。

问题描述 投票:0回答:1

我试图从我的Angular应用程序发送一个XML文件到我的ASP .Net Core控制器。我想让控制器接收文件,然后将其反序列化为一个强类型的对象列表。正确的方法是什么?目前,当文件被反序列化时,我收到了一个错误,该错误显示 "根级别的数据无效,第1行,位置1"。第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

c# excel xml asp.net-core deserialization
1个回答
0
投票

我建议你 read 流阅读器,然后将它们转换为 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();
        }
© www.soinside.com 2019 - 2024. All rights reserved.