user2859242 user2859242 - 4 years ago 84
C# Question

Create XML from a class where List<ItemDetails> is an entity

ANSWER:

Changed the class as suggested by Tim and it worked like a charm.

public class DatiBeniServizi1
{
[XmlElement]
public List<DettaglioLinee> DettaglioLinee { get; set; }

public DatiRiepilogo1 DatiRiepilogo { get; set; }
}


I'm trying to create an XML using a class. Below is the class

public class DatiBeniServizi1
{
public List<DettaglioLinee> DettaglioLinee { get; set; }

public DatiRiepilogo1 DatiRiepilogo { get; set; }
}
public class DettaglioLinee
{
public int NumeroLinea { get; set; }
public string Descrizione { get; set; }
public int Quantita { get; set; }
public decimal PrezzoUnitario { get; set; }
public decimal PrezzoTotale { get; set; }
public decimal AliquotaIVA { get; set; }
public string Natura { get; set; }
}
public class DatiRiepilogo1
{
public decimal AliquotaIVA { get; set; }
public string Natura { get; set; }
public decimal ImponibileImporto { get; set; }
public decimal Imposta { get; set; }
public string RiferimentoNormativo { get; set; }
}


and the code to generate XML

private DatiBeniServizi1 GetXMLExportInvoiceItemDetails(DataTable dtItemDetails, DataTable dtBatches)
{
DatiBeniServizi1 DatiBeniServizi12 = new DatiBeniServizi1();
List<DettaglioLinee> ItemDetails = new List<DettaglioLinee>();

int i = 1;
foreach (DataRow row in dtItemDetails.Rows)
{
DataRow[] rowList = dtBatches.Select("BatchItemID='" + row["ItemID"].ToString() + "'");
string BatchDetails = string.Empty;
if (rowList.Any())
{
foreach (DataRow dr in rowList)
{
BatchDetails = BatchDetails + " - " + "Batch No: " + dr["BatchNo"].ToString() + " Exp: " + Convert.ToDateTime(dr["Expiry Date"]).ToString("dd/MM/yy");
}
}
ItemDetails.Add(new DettaglioLinee
{
NumeroLinea = i,
Descrizione = row["Description"].ToString() + BatchDetails,
Quantita = Convert.ToInt32(row["Qty"]),
PrezzoUnitario = Convert.ToDecimal(row["Sell Price"]),
PrezzoTotale = Convert.ToDecimal(row["Amount"]),
AliquotaIVA = 0.00m,
Natura = "N4"
});
i++;
}
DatiBeniServizi12 = new DatiBeniServizi1
{
DettaglioLinee = ItemDetails,
DatiRiepilogo = new DatiRiepilogo1
{
AliquotaIVA = 0.00m,
Natura = "N4",
ImponibileImporto = Convert.ToDecimal(gvQuotationDetails.Rows[QuoteIndex].Cells["TotalQuoteAmount"].EditedFormattedValue),
Imposta = 0.00m,
RiferimentoNormativo = "rif normativo"
}
};

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("xsd", "http://www.w3.org/2001/XMLSchema");
ns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
ns.Add("versione", "FPA12");
XmlSerializer serializer = new XmlSerializer(typeof(FatturaElettronica), "http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2");
serializer.Serialize(System.IO.File.Create(@"C:\JD Pics\Schema_fatturapa_v1.3.xml"),DatiBeniServizi12,ns);

}


Final Output is

<DatiBeniServizi>
**<DettaglioLinee>
<DettaglioLinee>**
<NumeroLinea>1</NumeroLinea>
<Descrizione>ACARBOSE TAB 100MG 90 - Batch No: 854697 Exp: 15/11/20</Descrizione>
<Quantita>5</Quantita>
<PrezzoUnitario>30.50</PrezzoUnitario>
<PrezzoTotale>152.50</PrezzoTotale>
<AliquotaIVA>0.00</AliquotaIVA>
<Natura>N4</Natura>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>2</NumeroLinea>
<Descrizione>AEROCHAMBER PLUS DEVICE INFANT/MASK - Batch No: 748569 Exp: 23/11/20 - Batch No: 45789 Exp: 23/11/20</Descrizione>
<Quantita>400</Quantita>
<PrezzoUnitario>1.13</PrezzoUnitario>
<PrezzoTotale>452.00</PrezzoTotale>
<AliquotaIVA>0.00</AliquotaIVA>
<Natura>N4</Natura>
**</DettaglioLinee>
</DettaglioLinee>**
<DatiRiepilogo>
<AliquotaIVA>0.00</AliquotaIVA>
<Natura>N4</Natura>
<ImponibileImporto>604.50</ImponibileImporto>
<Imposta>0.00</Imposta>
<RiferimentoNormativo>rif normativo</RiferimentoNormativo>
</DatiRiepilogo>
</DatiBeniServizi>


So from the above XML everything is fine as per our requirement except the one highlighted in **

<DettaglioLinee>
<DettaglioLinee>


As you can see the node is repeated which is not the requirement.

Can you please help me with this. Trying to fix this from 2 days.

Thanks,
Prathap

Answer Source

This should work. It causes the list to be output in a flat structure - without the enclosing DettaglioLinee elements

[XmlElement] 
List<DettaglioLinee> ItemDetails = new List<DettaglioLinee>();
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download