将多个行值从数据库传递到 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
});
}
}
}
}
我想生成以下格式的 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
});
}
}
}
}