如何从xml反序列化数组

时间:2018-02-01 19:38:11

标签: c# xml deserialization

所以,我一直试图反序化这个XML:

<DCR>
   <Xcore_PD12M_ALL_PC_NC_Global>
      <Xcore>411</Xcore>
      <Categoria_de_Riesgo>Risk Alert</Categoria_de_Riesgo>
      <Probabilidad_de_incumplimiento>91.75</Probabilidad_de_incumplimiento>
      <HorizonteTiempo>
         <Desde>02.2018</Desde>
         <Hasta>01.2019</Hasta>
      </HorizonteTiempo>
      <Odds>
         <Odds_A_Favor>1</Odds_A_Favor>
         <Odds_EnContra>11.1</Odds_EnContra>
         <ObligorAzar>12.1</ObligorAzar>
         <ObligorIncumplimiento>11.1</ObligorIncumplimiento>
         <PorcientoDeudorIncumplimiento>97.61</PorcientoDeudorIncumplimiento>
         <PorcientoDeudorNoIncumplimiento>2.39</PorcientoDeudorNoIncumplimiento>
         <QuantilPoblacion>29.89</QuantilPoblacion>
      </Odds>
      <Mes_evaluacion>01.2018</Mes_evaluacion>
   </Xcore_PD12M_ALL_PC_NC_Global>
   <DeudasPorProducto>
      <Producto Nombre="Tarjeta de Crédito">
         <EstatusImg>CR</EstatusImg>
         <EstatusImg2 />
         <CantidadCuentas>2</CantidadCuentas>
         <CreditoAprobado Moneda="R.D. $">15000</CreditoAprobado>
         <TotalAdeudado>23488</TotalAdeudado>
         <Cuota>2194</Cuota>
         <EnAtraso />
         <EnLegal />
         <Castigado>17504</Castigado>
      </Producto>
      <Producto Nombre="Tarjeta de Crédito">
         <EstatusImg>CN</EstatusImg>
         <EstatusImg2 />
         <CantidadCuentas>1</CantidadCuentas>
         <CreditoAprobado Moneda="U.S. $">219</CreditoAprobado>
         <TotalAdeudado />
         <Cuota />
         <EnAtraso />
         <EnLegal />
         <Castigado />
      </Producto>
      <Producto Nombre="SERVICIOS">
         <EstatusImg>CR</EstatusImg>
         <EstatusImg2 />
         <CantidadCuentas>1</CantidadCuentas>
         <CreditoAprobado Moneda="R.D. $">2534</CreditoAprobado>
         <TotalAdeudado>2534</TotalAdeudado>
         <Cuota />
         <EnAtraso />
         <EnLegal />
         <Castigado>2534</Castigado>
      </Producto>
      <Producto Nombre="Producto de Telecomunicaciones">
         <EstatusImg>CG</EstatusImg>
         <EstatusImg2 />
         <CantidadCuentas>3</CantidadCuentas>
         <CreditoAprobado Moneda="R.D. $">3021</CreditoAprobado>
         <TotalAdeudado>1979</TotalAdeudado>
         <Cuota />
         <EnAtraso />
         <EnLegal />
         <Castigado />
      </Producto>
      <Producto Nombre="Préstamo">
         <EstatusImg>CN</EstatusImg>
         <EstatusImg2 />
         <CantidadCuentas>2</CantidadCuentas>
         <CreditoAprobado Moneda="R.D. $">40000</CreditoAprobado>
         <TotalAdeudado />
         <Cuota />
         <EnAtraso />
         <EnLegal />
         <Castigado />
      </Producto>
      <Total ID="R.D. $ PESO">
         <Total_CreditoAprobado>$60,555</Total_CreditoAprobado>
         <Total_Adeudado>$28,001</Total_Adeudado>
         <Total_Cuota>$2,194</Total_Cuota>
         <Total_EnAtraso />
         <Total_EnLegal />
         <Total_Castigado>$20,038</Total_Castigado>
      </Total>
      <Total ID="U.S. $ DOLAR">
         <Total_CreditoAprobado>$219</Total_CreditoAprobado>
         <Total_Adeudado />
         <Total_Cuota />
         <Total_EnAtraso />
         <Total_EnLegal />
         <Total_Castigado />
      </Total>
   </DeudasPorProducto>
</DCR>

无法反序列化此部分:

<DeudasPorProducto>
      <Producto Nombre="Tarjeta de Crédito">
         <EstatusImg>CR</EstatusImg>
         <EstatusImg2 />
         <CantidadCuentas>2</CantidadCuentas>
         <CreditoAprobado Moneda="R.D. $">15000</CreditoAprobado>
         <TotalAdeudado>23488</TotalAdeudado>
         <Cuota>2194</Cuota>
         <EnAtraso />
         <EnLegal />
         <Castigado>17504</Castigado>
      </Producto>
      <Producto Nombre="Tarjeta de Crédito">
         <EstatusImg>CN</EstatusImg>
         <EstatusImg2 />
         <CantidadCuentas>1</CantidadCuentas>
         <CreditoAprobado Moneda="U.S. $">219</CreditoAprobado>
         <TotalAdeudado />
         <Cuota />
         <EnAtraso />
         <EnLegal />
         <Castigado />
      </Producto>
      <Producto Nombre="SERVICIOS">
         <EstatusImg>CR</EstatusImg>
         <EstatusImg2 />
         <CantidadCuentas>1</CantidadCuentas>
         <CreditoAprobado Moneda="R.D. $">2534</CreditoAprobado>
         <TotalAdeudado>2534</TotalAdeudado>
         <Cuota />
         <EnAtraso />
         <EnLegal />
         <Castigado>2534</Castigado>
      </Producto>
      <Producto Nombre="Producto de Telecomunicaciones">
         <EstatusImg>CG</EstatusImg>
         <EstatusImg2 />
         <CantidadCuentas>3</CantidadCuentas>
         <CreditoAprobado Moneda="R.D. $">3021</CreditoAprobado>
         <TotalAdeudado>1979</TotalAdeudado>
         <Cuota />
         <EnAtraso />
         <EnLegal />
         <Castigado />
      </Producto>
      <Producto Nombre="Préstamo">
         <EstatusImg>CN</EstatusImg>
         <EstatusImg2 />
         <CantidadCuentas>2</CantidadCuentas>
         <CreditoAprobado Moneda="R.D. $">40000</CreditoAprobado>
         <TotalAdeudado />
         <Cuota />
         <EnAtraso />
         <EnLegal />
         <Castigado />
      </Producto>
      <Total ID="R.D. $ PESO">
         <Total_CreditoAprobado>$60,555</Total_CreditoAprobado>
         <Total_Adeudado>$28,001</Total_Adeudado>
         <Total_Cuota>$2,194</Total_Cuota>
         <Total_EnAtraso />
         <Total_EnLegal />
         <Total_Castigado>$20,038</Total_Castigado>
      </Total>
      <Total ID="U.S. $ DOLAR">
         <Total_CreditoAprobado>$219</Total_CreditoAprobado>
         <Total_Adeudado />
         <Total_Cuota />
         <Total_EnAtraso />
         <Total_EnLegal />
         <Total_Castigado />
      </Total>
   </DeudasPorProducto>

正如您所看到的,Element&#34; Producto&#34;与另一个名为&#34; Total&#34;的元素混在一起,这可能就是它不能反序列化的原因。这些是我使用的课程:

public  class DeudasPorProducto
    {
        [XmlElement("Producto")]
        public List<Producto> Productos { get; set; }
    }


 public class Xcore
    {
        [XmlElement("Xcore")]
        public int CrediScore { get; set; }

        [XmlElement("Categoria_de_Riesgo")]
        public string CategoriaRiesgo { get; set; }

        [XmlElement("Probabilidad_de_incumplimiento")]
        public double ProbabilidadIncumplimiento { get; set; }

        [XmlElement("HorizonteTiempo")]
        public Timeline HorizonteTiempo { get; set; }
        [XmlElement("Odds")]
        public Odds Odds { get; set; }

        [XmlElement("Mes_evaluacion")]
        public string MesEvaluacion { get; set; }

        [XmlElement("DeudasPorProducto")]
        public DeudasPorProducto Deudas { get; set; }


    }

   [XmlRoot("DCR")]
  public  class DataCreditoCreditReport
    {
        [XmlElement("Xcore_PD12M_ALL_PC_NC_Global")]
    public   Xcore Xcore { get; set; }
    }

我尝试的最后一件事是使用Producto Class作为列表作为Xcore上的属性:

   [XmlArray("DeudasPorProducto")]
    [XmlArrayItem("Producto")]
    public List<Producto> Productos { get; set; }

但它没有采取行动。此时我需要伸出援助之手。 :)

2 个答案:

答案 0 :(得分:1)

如果您在问题中复制XML示例并使用Visual Studio将其粘贴为类(编辑菜单 - &gt;选择性粘贴 - >将XML粘贴为类),它将为您提供大约900行样板代码(其中大部分这是非常多余的),但是这会毫无问题地反序列化,并且应该给你一个不错的起点。

background-size

然后您应该可以使用XmlElement属性开始调整属性名称。

        var xmlSerializer = new XmlSerializer(typeof(XmlClasses.DCR));

        using (var fileStream = new FileStream(@"TestXml.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            var dcr = (XmlClasses.DCR)xmlSerializer.Deserialize(fileStream);
        }

答案 1 :(得分:1)

您可以使用Xml2CSharp网络服务生成具有必要属性的类。

该服务返回C#类,您可以使用编码样式重命名。

我已检查生成的类,但工作正常。

我的小提琴手在这里:.NET Fiddler

您需要为Producte类使用下一个声明:

[XmlRoot(ElementName="DeudasPorProducto")]
public class DeudasPorProducto {
    [XmlElement(ElementName="Producto")]
    public List<Producto> Producto { get; set; }
}