从XML删除重复的节点

时间:2018-06-22 20:36:20

标签: .net xml core

我有一个代表发票的复杂XML。

我需要使用.NET Core和XmlSerializer生成如下的XML结构:

<DetalleServicio>
  <LineaDetalle>
    ALL MY VALUES HERE
  </LineaDetalle>
  <LineaDetalle>
    MY VALUES HERE
  </LineaDetalle>
</DetalleServicio>

如您所见,DetalleServicio可以包含许多LineaDetalle个孩子。

我正在尝试使用某些类来完成这项工作,所以我有:

public class DetalleServicio
{
  public List<LineaDetalle> LineaDetalle { get; set; }
}

public class LineaDetalle
{
   public int NumeroLinea { get; set; }
   public CodigoProducto[] Codigo { get; set; }
   public decimal Cantidad { get; set; }
   public string UnidadMedida { get; set; }
   public string UnidadMedidaComercial { get; set; }
   public string Detalle { get; set; }
   public decimal PrecioUnitario { get; set; }
   public decimal MontoTotal { get; set; }
   public decimal MontoDescuento { get; set; }
   public string NaturalezaDescuento { get; set; }
   public decimal SubTotal { get; set; }
   public Impuesto Impuesto { get; set; }
   public decimal MontoTotalLinea { get; set; }
}

Finally I'm doing something like this

DetalleServicio = new DetalleServicio()
{
  LineaDetalle = new List<LineaDetalle>()
  {
    new LineaDetalle()
    {
    },
    new LineaDetalle()
    {
    }
   }
 }

最后,我们使用XmlSerializer生成了XML,但是问题是XmlSerializerLineaDetalle写为父级,而LineaDetalle写为子级,例如:

<DetalleServicio>
  <LineaDetalle>
    <LineaDetalle>
      ALL MY VALUES HERE
    </LineaDetalle>
    <LineaDetalle>
      MY VALUES HERE
    </LineaDetalle>
  </LineaDetalle>
</DetalleServicio>

如何解决此问题?我尝试使用XmlDocument删除父<LineaDetalle>节点,但是会引发“ cs0 ...”错误。

谢谢。

1 个答案:

答案 0 :(得分:0)

我找到了答案:

因为我正在使用

public List<LineaDetalle> LineaDetalle { get; set; }

LineaDetalle = new List<LineaDetalle>()
 {
    new LineaDetalle()
    {}
    new LineaDetalle()
    {}
}

使用xmlserialize时,它导致具有两个层次结构来表示List<LineaDetalle>集合。您有一个<LineaDetalle>标签,然后对于该集合中的每个明细都有一个<LineaDetalle>标签

因此,要使用XmlSerializer消除标记,只需使用XmlElementAttribute更新LineaDetalle成员,该XmlElementAttribute指定要用于每个项目的名称

例如

 [XmlElement("LineaDetalle")]
 public List<LineaDetalle> LineaDetalle { get; set; }

现在实例正在被序列化器使用而没有额外的标签