将多个行值从数据库传递到 XML

To pass more than one row value from database to XML

我想生成以下格式的 xml 文件。

      <?xml version="1.0" encoding="utf-8"?>
      <AutoCount xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.autocountsoft.com/ac_accounting.xsd">
      <Product>AutoCount Accounting</Product>
      <Version>1.5</Version>
      <CreatedApplication>BApp</CreatedApplication>
      <CreatedBy>Business Solutions</CreatedBy>
      <Sales DocNo = 'S0001'>
      <Item>XXX</Item>
      <Qty>2</Qty>
      <Price>6.00</Price>
      </Sales>
      <Sales DocNo = 'S0002'>
      <Item>YYY</Item>
      <Qty>3</Qty>
      <Price>50.00</Price>
      </Sales>
      </AutoCount> 

我有一个包含四列 Docno、item、qty、price 和两行数据的网格。 但我只得到一个销售节点,网格中有最后一行数据。

我试过的代码如下,

        string PATH = "C:\Samplex.xml";
        CreateEmptyFile(PATH);

        var data = new AutoCount();
        data.Product = "AutoCount Accounting";
        data.Version = "1.5";
        data.CreatedApplication = "BApp";
        data.CreatedBy = "Business Solutions";
        data.CreatedDateTime = DateTime.Now;
    for (int i = 0; i < dataGridView1.RowCount - 1; i++) 
    {
        var sales = new SalesInvoice();
        data.SalesInvoice = new[] { sales };
        sales.DocNo = dataGridView1.Rows[i].Cells[0].FormattedValue.ToString(); 
        sales.Item = dataGridView1.Rows[i].Cells[1].FormattedValue.ToString();
        sales.Qty = dataGridView1.Rows[i].Cells[2].FormattedValue.ToString(); 
        sales.Price = dataGridView1.Rows[i].Cells[3].FormattedValue.ToString();
        var serializer1 = new XmlSerializer(typeof(SalesInvoice)); 
    }
      var serializer = new XmlSerializer(typeof(AutoCount));
        using (var stream = new StreamWriter(PATH))
        serializer.Serialize(stream, data);

输出为:

      <?xml version="1.0" encoding="utf-8"?>
      <AutoCount xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.autocountsoft.com/ac_accounting.xsd">
      <Product>AutoCount Accounting</Product>
      <Version>1.5</Version>
      <CreatedApplication>BApp</CreatedApplication>
      <CreatedBy>Business Solutions</CreatedBy>
      <Sales DocNo = 'S0002'>
      <Item>YYY</Item>
      <Qty>3</Qty>
      <Price>50.00</Price>
      </Sales>
      </AutoCount> 

除其他问题外,主要问题在这里:

data.SalesInvoice = new[] { sales };

您在每个循环循环中从头开始创建 SalesInvoice 数组,而不是在循环之前创建它并在其中添加元素。

我会这样做(请也看看变量名):

//Plural as it is a list
List<SalesInvoice> salesInvoices = new List<SalesInvoice>();

for (int i = 0; i < dataGridView1.RowCount - 1; i++)
{
    //Singular as it is a single element
    var salesInvoice = new SalesInvoice();
    salesInvoice.DocNo = dataGridView1.Rows[i].Cells[0].FormattedValue.ToString();
    salesInvoice.Item = dataGridView1.Rows[i].Cells[1].FormattedValue.ToString();
    salesInvoice.Qty = dataGridView1.Rows[i].Cells[2].FormattedValue.ToString();
    salesInvoice.Price = dataGridView1.Rows[i].Cells[3].FormattedValue.ToString();
    salesInvoices.Add(salesInvoice);

    //What's the purpose of the next line?
    var serializer1 = new XmlSerializer(typeof(SalesInvoice));
}

// I pluralized this property name too
data.SalesInvoices = salesInvoices.ToArray();

使用 DataSet/DataTable 程序变得微不足道。向您的表单添加两个数据网格视图。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        const string FILENAME = @"c:\temp\test.xml";
        AutoCount autoCount = new AutoCount();
        public Form1()
        {
            InitializeComponent();

            autoCount.ds.WriteXml(FILENAME, XmlWriteMode.WriteSchema);
            dataGridView1.DataSource = autoCount.ds.Tables["AutoCount"];
            dataGridView2.DataSource = autoCount.ds.Tables["Sales"];

        }
        public class AutoCount
        {
            public DataSet ds {get; set;} 


            public AutoCount()
            {
                ds = new DataSet();
                DataTable autoCount = new DataTable("AutoCount");
                ds.Tables.Add(autoCount);
                DataTable sales = new DataTable("Sales");
                ds.Tables.Add(sales);

                autoCount.Columns.Add("Product", typeof(string));
                autoCount.Columns.Add("Version", typeof(string));
                autoCount.Columns.Add("CreatedApplication", typeof(string));
                autoCount.Columns.Add("CreatedBy", typeof(string));
                autoCount.Rows.Add(new string[] {
                    "AutoCount Accounting",
                    "1.5",
                    "BApp",
                    "Business Solutions"
                });

                sales.Columns.Add("DocNo", typeof(string));
                sales.Columns.Add("Item", typeof(string));
                sales.Columns.Add("Qty", typeof(int));
                sales.Columns.Add("Price", typeof(double));

                sales.Rows.Add(new object[] {
                    "S0001",
                    "XXX",
                    2,
                    6.00
                });

                sales.Rows.Add(new object[] {
                    "S0002",
                    "YYY",
                    3,
                    50.00
                });

            }
        }

    }
}