从 class 创建 XML,其中 List<ItemDetails> 是一个实体

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

答案:

按照 Tim 的建议更改了 class,效果非常好。

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

        public DatiRiepilogo1 DatiRiepilogo { get; set; }
    }

我正在尝试使用 class 创建 XML。下面是 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; }        
        }

和生成代码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);  

        }

最终输出为

<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>

所以从上面 XML 来看,除了 **

中突出显示的那个,其他都符合我们的要求
<DettaglioLinee>
        <DettaglioLinee>

如您所见,节点重复,这不是要求。

这应该有效。它导致列表以平面结构输出 - 没有封闭的 DettaglioLinee 元素

[XmlElement] 
List<DettaglioLinee> ItemDetails = new List<DettaglioLinee>();