【问题标题】:Reading from Xml FIle into existing dataTable C# ASP.NET Core从 Xml 文件读取到现有数据表 C# ASP.NET Core
【发布时间】:2017-04-20 08:18:45
【问题描述】:

这是我遇到问题的方法:

[HttpPost]
    public async Task<IActionResult> XmlPage(IFormFile xmlFile)
    { 
      var uploads = hostingEnvironment.WebRootPath;
        if (xmlFile.ContentType.Equals("application/xml") || xmlFile.ContentType.Equals("text/xml"))
        {
            try
            {
                using (var fileStream = new FileStream(Path.Combine(uploads, xmlFile.FileName), FileMode.Create))
                {
                    await xmlFile.CopyToAsync(fileStream);
                    XDocument xDoc = XDocument.Load(fileStream);
                    List<DmgRegister> dmgRegistterList = xDoc.Descendants("Claim").Select(dmgReg =>
                    new DmgRegister
                    {
                        Uwyear = dmgReg.Element("UWYear").Value,
                        ClaimNo = dmgReg.Element("ClaimNo").Value,
                        PolicyNo = dmgReg.Element("PolicyNo").Value,
                        PolicyName = dmgReg.Element("PolicyHolder").Value,
                        Address1 = dmgReg.Element("Address1").Value,
                        Address2 = dmgReg.Element("Addresstype").Value,
                        PostalLocation = dmgReg.Element("City").Value,
                        Country = dmgReg.Element("Country").Value,
                        PostalCode = dmgReg.Element("Postalzone").Value
                    }).ToList();
                    context.SaveXmlToDb(dmgRegistterList);

            }
            catch
            {
//Here where i come when i try to upload and parse the data
                ViewBag.Error = "Converting fail";
                return View("Export");
            }
        }
        else
        {
            ViewBag.Error = "Uploading fail";
            return View("Index");
        }
        return View();
    }

我正在尝试上传一个 xml 文件,然后解析成一个 SQL 表(名为 DmgRegister 的 Sql 数据表),我是 ASP.Net 的初学者,如果代码看起来像意大利面条,请见谅。

       // SaveXmlToDb method in context 
          foreach (var item in dmgRegistterList)
            {
                DmgRegister.Add(item);
            }
        SaveChanges();
                }

现在我正在尝试从 XML 绑定数据并将其保存到 DataTable 的模型

 [Serializable]
[XmlRoot("Claims")]
public class Claim
{
    [XmlElement("ClientName")]
    public string ClientName { get; set; }
    [XmlElement("UWYear")]
    public string Uwyear { get; set; }
    [XmlElement("AgreementNo")]
    public string AgreementNo { get; set; }
    [XmlElement("BusinessType")]
    public string BusinessType { get; set; }
    [XmlElement("PeriodStart")]
    public DateTime? PeriodStart { get; set; }
    [XmlElement("PeriodEnd")]
    public DateTime? PeriodEnd { get; set; }
    [XmlElement("PolicyNo")]
    public string PolicyNo { get; set; }
    [XmlElement("PolicyHolder")]
    public string PolicyName { get; set; }
    [XmlElement("DateOfLoss")]
    public DateTime? DateOfLoss { get; set; }
    [XmlElement("ClaimNo")]
    public string ClaimNo { get; set; }
    [XmlElement("ClaimantName")]
    public string ClaimantName { get; set; }
    [XmlElement("ClaimedInsured")]
    public string ClaimedInsured { get; set; }
    [XmlElement("ReportDate")]
    public DateTime? ReportDate { get; set; }
    [XmlElement("CountryOfRisk")]
    public string CountryOfRisk { get; set; }
    [XmlElement("CountryOfLoss")]
    public string CountryOfLoss { get; set; }
    [XmlElement("TypeOfLoss")]
    public string TypeOfLoss { get; set; }
    [XmlElement("InsuranceCoverage")]
    public string InsuranceCoverage { get; set; }
    [XmlElement("LineOfBuisnessNo")]
    public int? LineOfBuisnessNo { get; set; }
    [XmlElement("LineOfBuisnessName")]
    public string LineOfBuisnessName { get; set; }
    [XmlElement("ClassOfBuisnessNo")]
    public int? ClassOfBuisnessNo { get; set; }
    [XmlElement("ClassOfBuisnessName")]
    public string ClassOfBuisnessName { get; set; }
    [XmlElement("CaptiveShare")]
    public int? CaptiveShare { get; set; }
    [XmlElement("OriginalCurrency")]
    public string OriginalCurrency { get; set; }
    [XmlElement("PaymentCurrency")]
    public string PaidInCurrency { get; set; }
    [XmlElement("TotalIncurredCaptiveShare")]
    public decimal? TotalIncurredCaptiveShare { get; set; }
    [XmlElement("PaidThisPeriod")]
    public decimal? PaidThisPeriod { get; set; }
    [XmlElement("PeriodDate")]
    public DateTime? PeriodDate { get; set; }
    [XmlElement("PaymentDate")]
    public DateTime? PaymentDate { get; set; }
    [XmlElement("TotalPaidCaptiveShare")]
    public decimal? TotalPaidCaptiveShare { get; set; }
    [XmlElement("RemainingReserveCaptiveShare")]
    public decimal? RemainingReserveCaptiveShare { get; set; }
    [XmlElement("Deductible")]
    public string Deductible { get; set; }
    [XmlElement("Recovery")]
    public string Recovery { get; set; }
    [XmlElement("LocationAdress")]
    public string LocationAdress { get; set; }
    [XmlElement("Address1")]
    public string Address1 { get; set; }
    [XmlElement("Addresstype")]
    public string Address2 { get; set; }
    [XmlElement("Postalzone")]
    public string PostalCode { get; set; }
    [XmlElement("City")]
    public string PostalLocation { get; set; }
    [XmlElement("Country")]
    public string Country { get; set; }
    [XmlElement("GeograficalDiversification")]
    public string GeograficalDiversification { get; set; }
    [XmlElement("Cause")]
    public string Cause { get; set; }
    [XmlElement("Status")]
    public string Status { get; set; }
    [XmlElement("CloseDate")]
    public DateTime? CloseDate { get; set; }
    [XmlElement("DevelopmentYear")]
    public string DevelopmentYear { get; set; }
    [XmlElement("TotalIncurredInsurerShare")]
    public decimal? TotalIncurredInsurerShare { get; set; }
    [XmlElement("TotalPaidInsurerShare")]
    public decimal? TotalPaidInsurerShare { get; set; }
    [XmlElement("RemainingReserveInsurerShare")]
    public decimal? RemainingReserveInsurerShare { get; set; }

}
[Serializable()]
[XmlRoot("Claims")]
public class Claims
{
    [XmlArray("Claims")]
    [XmlArrayItem("Claim", typeof(Claim))]
    public Claim[] Claim { get; set; }
}

这是我尝试上传的 Xml 示例

<ns0:Claims>
<Claim>
<ClaimNo>LL0000110262</ClaimNo>
<PolicyNo>LP0000004481</PolicyNo>
<PolicyHolder>NCC Rakennus Oy</PolicyHolder>
<AddressId>1</AddressId>
<Address1>Example Street 1</Address1>
<Addresstype>LocationOfLoss</Addresstype>
<City>Helsinki</City>
<Country>FI</Country>
<Postalzone>12345</Postalzone>
<UWYear>2015</UWYear>
<PeriodStart>2015-01-01</PeriodStart>
<PeriodEnd>2015-12-31</PeriodEnd>
<DateOfLoss>2015-07-15</DateOfLoss>
<ReportDate/>
<StatusAsPer>2015-12-31</StatusAsPer>
<Coverage>?</Coverage>
<TypeOfLoss>Leakage</TypeOfLoss>
<OriginalCurrency>EUR</OriginalCurrency>
<PaymentCurrency>EUR</PaymentCurrency>
<TotalReservesOrigCurr>0.00</TotalReservesOrigCurr>
<TotalPaymentOrigCurr>0.00</TotalPaymentOrigCurr>
<DeductibleOrigCurr>85000.00</DeductibleOrigCurr>
<TotalAmountOfClaimOrigCurr>3680.00</TotalAmountOfClaimOrigCurr>
<Status>Active</Status>
</Claim>
</ns0:Claims>

我什至尝试将它从 XML 转换为 JSON,但它会跳起来捕捉

        public async Task<IActionResult> XmlPage(IFormFile xmlFile)
    {
        var uploads = hostingEnvironment.WebRootPath;
        var filePath = Path.Combine(uploads, xmlFile.FileName);
        if (xmlFile.ContentType.Equals("application/xml") || xmlFile.ContentType.Equals("text/xml"))
        {
            try
            {
                    using (var xReader = XmlReader.Create(new StringReader(filePath)))
                    {
                        // This line skips the XML declaration, eg "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" - you can skip this if you don't have declaration as in your case
                        xReader.MoveToContent();
                        // Gets the actual XMLElement, if any
                        xReader.Read();
                        // Convert the xReader to an XNode for the Json serializer
                        XNode node = XNode.ReadFrom(xReader);
                        // Json output
                        string jsonText = JsonConvert.SerializeXNode(node);



                }
            }
            catch
            {
                ViewBag.Error = "Converting fail";
                return View("Export");
            }
        }
        else
        {
            ViewBag.Error = "Uploading fail";
            return View();
        }
        return View("Index");
    }

【问题讨论】:

  • 请包括您遇到的问题。是构建失败还是您获得的结果有问题? AFAIK dotnet core 还没有太多的 Xml 支持。您可以改用 Json 来回避这个问题。
  • 我正在将 xml 文件上传到 wwwroot,但是它假设从该文件读取到列表中的点失败并且程序提前运行到 Catch
  • 抛出异常会很有帮助。更新 try 语句 catch 它:try { } catch(Exception e){ }。 e中的错误是什么?
  • “缺少根元素”
  • 当我改变时--- XDocument xDoc = XDocument.Load(fileStream);---- to----- XDocument xDoc = XDocument.Load(filePath);--- 然后我收到此错误消息 该进程无法访问文件“C:\Users\Housam\Desktop\LIA\CapinPhase1\CapinSolutions\CapinSolutions\wwwroot\Solvency2_Insurance_Schema_examples_If_20160208.xml”,因为它正被另一个进程使用。

标签: c# asp.net database xml-parsing


【解决方案1】:

非常感谢 CountZero,在我在这里提出第一个问题后,真的很感激,仍然有问题,但现在一切正常, 控制器中的方法

       public async Task<IActionResult> XmlPage(IFormFile xmlFile)
    {
        var uploads = hostingEnvironment.WebRootPath;
        var filePath = Path.Combine(uploads, xmlFile.FileName).ToString();

        if (xmlFile.ContentType.Equals("application/xml") || xmlFile.ContentType.Equals("text/xml"))
        {
            try
            {
                using (var fileStream = new FileStream(filePath, FileMode.Create))
                {
                    await xmlFile.CopyToAsync(fileStream);
                    fileStream.Dispose();
                    XDocument xDoc = XDocument.Load(filePath);
                    List<DmgRegisterVM> dmgRegistterList = xDoc.Descendants("Claim").Select(dmgReg =>
                    new DmgRegisterVM
                    {
                        Uwyear = dmgReg.Element("UWYear").Value,
                        ClaimNo = dmgReg.Element("ClaimNo").Value,
                        PolicyNo = dmgReg.Element("PolicyNo").Value,
                        PolicyName = dmgReg.Element("PolicyHolder").Value,
                        Address1 = dmgReg.Element("Address1").Value,
                        Address2 = dmgReg.Element("Addresstype").Value,
                        PostalLocation = dmgReg.Element("City").Value,
                        Country = dmgReg.Element("Country").Value,
                        PostalCode = dmgReg.Element("Postalzone").Value
                    }).ToList();
                    context.SaveXmlToDb(dmgRegistterList);
                }
            }
            catch(Exception e)
            {
                    ViewBag.Error = "Converting fail";
            }
        }
        else
        {
            ViewBag.Error = "Uploading fail";
        }
        return View("Index");
    }

上下文中的SaveXmlToDb方法

        public void SaveXmlToDb(List<DmgRegisterVM> dmgRegList)
    {
        //from list to database
        foreach (var item in dmgRegList)
        {
            var model = Mapper.Map<DmgRegister>(item);
            DmgRegister.Add(model);
            SaveChanges();         
        }
    }

最后是 Claim 类(我有 XML 元素)

 [Serializable]
[XmlRoot("ns0:Claims")]
public class Claim
{
    [XmlElement("ClientName")]
    public string ClientName { get; set; }
    [XmlElement("UWYear")]
    public string Uwyear { get; set; }
    [XmlElement("AgreementNo")]
    public string AgreementNo { get; set; }
    [XmlElement("BusinessType")]
    public string BusinessType { get; set; }
    [XmlElement("PeriodStart")]
    public DateTime? PeriodStart { get; set; }
    [XmlElement("PeriodEnd")]
    public DateTime? PeriodEnd { get; set; }
    [XmlElement("PolicyNo")]
    public string PolicyNo { get; set; }
    [XmlElement("PolicyHolder")]
    public string PolicyName { get; set; }
    [XmlElement("DateOfLoss")]
    public DateTime? DateOfLoss { get; set; }
    [XmlElement("ClaimNo")]
    public string ClaimNo { get; set; }
    [XmlElement("ClaimantName")]
    public string ClaimantName { get; set; }
    [XmlElement("ClaimedInsured")]
    public string ClaimedInsured { get; set; }
    [XmlElement("ReportDate")]
    public DateTime? ReportDate { get; set; }
    [XmlElement("CountryOfRisk")]
    public string CountryOfRisk { get; set; }
    [XmlElement("CountryOfLoss")]
    public string CountryOfLoss { get; set; }
    [XmlElement("TypeOfLoss")]
    public string TypeOfLoss { get; set; }
    [XmlElement("InsuranceCoverage")]
    public string InsuranceCoverage { get; set; }
    [XmlElement("LineOfBuisnessNo")]
    public int? LineOfBuisnessNo { get; set; }
    [XmlElement("LineOfBuisnessName")]
    public string LineOfBuisnessName { get; set; }
    [XmlElement("ClassOfBuisnessNo")]
    public int? ClassOfBuisnessNo { get; set; }
    [XmlElement("ClassOfBuisnessName")]
    public string ClassOfBuisnessName { get; set; }
    [XmlElement("CaptiveShare")]
    public int? CaptiveShare { get; set; }
    [XmlElement("OriginalCurrency")]
    public string OriginalCurrency { get; set; }
    [XmlElement("PaymentCurrency")]
    public string PaidInCurrency { get; set; }
    [XmlElement("TotalIncurredCaptiveShare")]
    public decimal? TotalIncurredCaptiveShare { get; set; }
    [XmlElement("PaidThisPeriod")]
    public decimal? PaidThisPeriod { get; set; }
    [XmlElement("PeriodDate")]
    public DateTime? PeriodDate { get; set; }
    [XmlElement("PaymentDate")]
    public DateTime? PaymentDate { get; set; }
    [XmlElement("TotalPaidCaptiveShare")]
    public decimal? TotalPaidCaptiveShare { get; set; }
    [XmlElement("RemainingReserveCaptiveShare")]
    public decimal? RemainingReserveCaptiveShare { get; set; }
    [XmlElement("Deductible")]
    public string Deductible { get; set; }
    [XmlElement("Recovery")]
    public string Recovery { get; set; }
    [XmlElement("LocationAdress")]
    public string LocationAdress { get; set; }
    [XmlElement("Address1")]
    public string Address1 { get; set; }
    [XmlElement("Addresstype")]
    public string Address2 { get; set; }
    [XmlElement("Postalzone")]
    public string PostalCode { get; set; }
    [XmlElement("City")]
    public string PostalLocation { get; set; }
    [XmlElement("Country")]
    public string Country { get; set; }
    [XmlElement("GeograficalDiversification")]
    public string GeograficalDiversification { get; set; }
    [XmlElement("Cause")]
    public string Cause { get; set; }
    [XmlElement("Status")]
    public string Status { get; set; }
    [XmlElement("CloseDate")]
    public DateTime? CloseDate { get; set; }
    [XmlElement("DevelopmentYear")]
    public string DevelopmentYear { get; set; }
    [XmlElement("TotalIncurredInsurerShare")]
    public decimal? TotalIncurredInsurerShare { get; set; }
    [XmlElement("TotalPaidInsurerShare")]
    public decimal? TotalPaidInsurerShare { get; set; }
    [XmlElement("RemainingReserveInsurerShare")]
    public decimal? RemainingReserveInsurerShare { get; set; }

}
//[ModelMetadataType(typeof(DmgRegisterMetaData))]
[Serializable()]
[XmlRoot("ns0:Claims")]
public class ClaimsCollection
{
    [XmlArray("Claims")]
    [XmlArrayItem("Claim", typeof(Claim))]
    public Claim[] Claim { get; set; }
}

【讨论】:

  • 很高兴我能帮上忙 :)
【解决方案2】:

鉴于您收到“缺少根元素”,这看起来像是您的映射存在问题。

[XmlRoot("Claims")] 不会映射到 &lt;ns0:Claims&gt;

尝试更新您的 XML,以便将根元素设置为 &lt;Claims&gt;&lt;/Claims&gt; 而不是

&lt;ns0:Claims&gt;&lt;/ns0:Claims&gt;.

如果这解决了问题,那么您可以更改 XML 或更新类中的属性,使其看起来像这样。

[XmlRoot("ns0:Claims")].

【讨论】:

    猜你喜欢
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多