Как XML файл прочитать?
Подскажите, как прочитать такой файл, в одну или несколько DataGridView таблиц и чтобы данные можно было бы связать.
Это файл продажи, в котором указан Клиент, номер счёта и т.д. и детальные строки что было продано.
Читаю в 3 разные таблицы, но как то думаю можно всё в одну и связать между собой. в моём случае непонятно какому клиенту какой заказ.
{
//Create xml reader
XmlReader xmlFile = XmlReader.Create(@"D:\MyDocuments\Desktop\export_import.xml", new XmlReaderSettings());
DataSet dataSet = new DataSet();
//Read xml to dataset
dataSet.ReadXml(xmlFile);
//Pass empdetails table to datagridview datasource
dataGridView1.DataSource = dataSet.Tables["klientas"];
//Close xml reader
xmlFile.Close();
}
{
//xml reader
XmlReader xmlFile = XmlReader.Create(@"D:\MyDocuments\Desktop\export_import.xml", new XmlReaderSettings());
DataSet dataSet = new DataSet();
//Read xml to dataset
dataSet.ReadXml(xmlFile);
//Pass empdetails table to datagridview datasource
dg_pard.DataSource = dataSet.Tables["pardavimoRezervavimas"];
//Close xml reader
xmlFile.Close();
}
{
//xml reader
XmlReader xmlFile = XmlReader.Create(@"D:\MyDocuments\Desktop\export_import.xml", new XmlReaderSettings());
DataSet dataSet = new DataSet();
//Read xml to dataset
dataSet.ReadXml(xmlFile);
//Pass empdetails table to datagridview datasource
dg_pard1.DataSource = dataSet.Tables["eilute"];
//Close xml reader
xmlFile.Close();
}
Прикрепляю какой должен быть результат:
<?xml version="1.0" encoding="utf-8"?>
<fvsdata>
<klientas>
<kodas>MUST_LT</kodas>
<pavadinimas>Lina XXXX</pavadinimas>
<adresas>Adresas TV</adresas>
<rusis>LT</rusis>
<pozymis1>ESHOP</pozymis1>
<pozymis2>ESHOP_FIZ</pozymis2>
<pozymis3>ESHOP</pozymis3>
<pvm_kodas>21PVM</pvm_kodas>
<im_kodas/>
</klientas>
<pardavimoRezervavimas>
<serija>MUST</serija>
<dokumentas>5239</dokumentas>
<klientas>MUST_LT</klientas>
<data>2021.10.25</data>
<valiuta>EUR</valiuta>
<imp_param>ESHOP</imp_param>
<pavadinimas3>KRED</pavadinimas3>
<pavadinimas5>DPD</pavadinimas5>
<operacijaDet>
<eilute>
<sandelis>DISTRIB_S</sandelis>
<tipas>1</tipas>
<kodas>00000009</kodas>
<pavadinimas>Kavos kapsulės Ristretto, Dolce Gusto® aparatui, 16vnt</pavadinimas>
<kiekis>3</kiekis>
<suma_v>9.110000</suma_v>
<suma_l>9.110000</suma_l>
<suma_pvmv>1.92</suma_pvmv>
<suma_pvml>1.92</suma_pvml>
<suma_nv/>
<suma_nl/>
<objektas2>DISTRIBUCI</objektas2>
<objektas3/>
<objektas6>E_MUST</objektas6>
</eilute>
<eilute>
<sandelis>DISTRIB_S</sandelis>
<tipas>1</tipas>
<kodas>00000008</kodas>
<pavadinimas>Kavos kapsulės Cremoso, Dolce Gusto® aparatui, 16vnt</pavadinimas>
<kiekis>4</kiekis>
<suma_v>11.340000</suma_v>
<suma_l>11.340000</suma_l>
<suma_pvmv>2.38</suma_pvmv>
<suma_pvml>2.38</suma_pvml>
<suma_nv/>
<suma_nl/>
<objektas2>DISTRIBUCI</objektas2>
<objektas3/>
<objektas6>E_MUST</objektas6>
</eilute>
<eilute>
<sandelis/>
<tipas>2</tipas>
<kodas>LOGISTIKOS_P</kodas>
<pavadinimas>Logistikos paslaugos</pavadinimas>
<kiekis>100</kiekis>
<suma_v>1.570000</suma_v>
<suma_l>1.570000</suma_l>
<suma_pvmv>0.33</suma_pvmv>
<suma_pvml>0.33</suma_pvml>
<suma_nv/>
<suma_nl/>
<objektas2>DISTRIBUCI</objektas2>
<objektas3>LOG PASL</objektas3>
<objektas6>E_MUST</objektas6>
</eilute>
</operacijaDet>
</pardavimoRezervavimas>
<klientas>
<kodas>MUST_LT</kodas>
<pavadinimas>Vida XXXX</pavadinimas>
<adresas>Adresas TV</adresas>
<rusis>LT</rusis>
<pozymis1>ESHOP</pozymis1>
<pozymis2>ESHOP_FIZ</pozymis2>
<pozymis3>ESHOP</pozymis3>
<pvm_kodas>21PVM</pvm_kodas>
<im_kodas/>
</klientas>
<pardavimoRezervavimas>
<serija>MUST</serija>
<dokumentas>5240</dokumentas>
<klientas>MUST_LT</klientas>
<data>2021.10.25</data>
<valiuta>EUR</valiuta>
<imp_param>ESHOP</imp_param>
<pavadinimas3>KRED</pavadinimas3>
<pavadinimas5>OMNIVA</pavadinimas5>
<operacijaDet>
<eilute>
<sandelis>DISTRIB_S</sandelis>
<tipas>1</tipas>
<kodas>00000013</kodas>
<pavadinimas>Karšto šokolado kapsulės, Dolce Gusto® aparatui, 16vnt</pavadinimas>
<kiekis>3</kiekis>
<suma_v>7.900000</suma_v>
<suma_l>7.900000</suma_l>
<suma_pvmv>1.66</suma_pvmv>
<suma_pvml>1.66</suma_pvml>
<suma_nv/>
<suma_nl/>
<objektas2>DISTRIBUCI</objektas2>
<objektas3/>
<objektas6>E_MUST</objektas6>
</eilute>
<eilute>
<sandelis/>
<tipas>2</tipas>
<kodas>LOGISTIKOS_P</kodas>
<pavadinimas>Logistikos paslaugos</pavadinimas>
<kiekis>100</kiekis>
<suma_v>1.570000</suma_v>
<suma_l>1.570000</suma_l>
<suma_pvmv>0.33</suma_pvmv>
<suma_pvml>0.33</suma_pvml>
<suma_nv/>
<suma_nl/>
<objektas2>DISTRIBUCI</objektas2>
<objektas3>LOG PASL</objektas3>
<objektas6>E_MUST</objektas6>
</eilute>
</operacijaDet>
</pardavimoRezervavimas>
<klientas>
<kodas>MUST_LT</kodas>
<pavadinimas>Rima XXXXX</pavadinimas>
<adresas>Adresas TV</adresas>
<rusis>LT</rusis>
<pozymis1>ESHOP</pozymis1>
<pozymis2>ESHOP_FIZ</pozymis2>
<pozymis3>ESHOP</pozymis3>
<pvm_kodas>21PVM</pvm_kodas>
<im_kodas/>
</klientas>
<pardavimoRezervavimas>
<serija>MUST</serija>
<dokumentas>5241</dokumentas>
<klientas>MUST_LT</klientas>
<data>2021.10.25</data>
<valiuta>EUR</valiuta>
<imp_param>ESHOP</imp_param>
<pavadinimas3>KRED</pavadinimas3>
<pavadinimas5>OMNIVA</pavadinimas5>
<operacijaDet>
<eilute>
<sandelis>DISTRIB_S</sandelis>
<tipas>1</tipas>
<kodas>00000013</kodas>
<pavadinimas>Karšto šokolado kapsulės, Dolce Gusto® aparatui, 16vnt</pavadinimas>
<kiekis>2</kiekis>
<suma_v>5.260000</suma_v>
<suma_l>5.260000</suma_l>
<suma_pvmv>1.11</suma_pvmv>
<suma_pvml>1.11</suma_pvml>
<suma_nv/>
<suma_nl/>
<objektas2>DISTRIBUCI</objektas2>
<objektas3/>
<objektas6>E_MUST</objektas6>
</eilute>
<eilute>
<sandelis>DISTRIB_S</sandelis>
<tipas>1</tipas>
<kodas>00000016</kodas>
<pavadinimas>Kavos kapsulės Cappuccino Barista, Dolce Gusto® aparatui, 16vnt</pavadinimas>
<kiekis>1</kiekis>
<suma_v>2.830000</suma_v>
<suma_l>2.830000</suma_l>
<suma_pvmv>0.6</suma_pvmv>
<suma_pvml>0.6</suma_pvml>
<suma_nv/>
<suma_nl/>
<objektas2>DISTRIBUCI</objektas2>
<objektas3/>
<objektas6>E_MUST</objektas6>
</eilute>
<eilute>
<sandelis>DISTRIB_S</sandelis>
<tipas>1</tipas>
<kodas>00000019</kodas>
<pavadinimas>Kavos kapsulės Latte Macchiato, Dolce Gusto® aparatui, 16vnt</pavadinimas>
<kiekis>1</kiekis>
<suma_v>2.630000</suma_v>
<suma_l>2.630000</suma_l>
<suma_pvmv>0.56</suma_pvmv>
<suma_pvml>0.56</suma_pvml>
<suma_nv/>
<suma_nl/>
<objektas2>DISTRIBUCI</objektas2>
<objektas3/>
<objektas6>E_MUST</objektas6>
</eilute>
<eilute>
<sandelis>DISTRIB_S</sandelis>
<tipas>1</tipas>
<kodas>00000035</kodas>
<pavadinimas>Ekologiškos arbatos kapsulės, juodoji su citrina, Dolce Gusto® aparatui, 16 vnt.</pavadinimas>
<kiekis>1</kiekis>
<suma_v>2.630000</suma_v>
<suma_l>2.630000</suma_l>
<suma_pvmv>0.56</suma_pvmv>
<suma_pvml>0.56</suma_pvml>
<suma_nv/>
<suma_nl/>
<objektas2>DISTRIBUCI</objektas2>
<objektas3/>
<objektas6>E_MUST</objektas6>
</eilute>
<eilute>
<sandelis/>
<tipas>2</tipas>
<kodas>LOGISTIKOS_P</kodas>
<pavadinimas>Logistikos paslaugos</pavadinimas>
<kiekis>100</kiekis>
<suma_v>1.570000</suma_v>
<suma_l>1.570000</suma_l>
<suma_pvmv>0.33</suma_pvmv>
<suma_pvml>0.33</suma_pvml>
<suma_nv/>
<suma_nl/>
<objektas2>DISTRIBUCI</objektas2>
<objektas3>LOG PASL</objektas3>
<objektas6>E_MUST</objektas6>
</eilute>
</operacijaDet>
</pardavimoRezervavimas>
<klientas>
<kodas>MUST_LV</kodas>
<pavadinimas>Ekaterina XXXX</pavadinimas>
<adresas>Adresas TV</adresas>
<rusis>LV_EE</rusis>
<pozymis1>ESHOP</pozymis1>
<pozymis2>ESHOP_FIZ</pozymis2>
<pozymis3>ESHOP</pozymis3>
<pvm_kodas>21PVM</pvm_kodas>
<im_kodas/>
</klientas>
<pardavimoRezervavimas>
<serija>MUST</serija>
<dokumentas>5242</dokumentas>
<klientas>MUST_LV</klientas>
<data>2021.10.25</data>
<valiuta>EUR</valiuta>
<imp_param>ESHOP</imp_param>
<pavadinimas3>KRED</pavadinimas3>
<pavadinimas5>DPD</pavadinimas5>
<operacijaDet>
<eilute>
<sandelis>DISTRIB_S</sandelis>
<tipas>1</tipas>
<kodas>00000008</kodas>
<pavadinimas>Kafija kapsulas Cremoso – saderīgas ar Dolce Gusto® aparātiem, 16 gab.</pavadinimas>
<kiekis>1</kiekis>
<suma_v>2.830000</suma_v>
<suma_l>2.830000</suma_l>
<suma_pvmv>0.6</suma_pvmv>
<suma_pvml>0.6</suma_pvml>
<suma_nv/>
<suma_nl/>
<objektas2>DISTRIBUCI</objektas2>
<objektas3/>
<objektas6>E_MUST</objektas6>
</eilute>
<eilute>
<sandelis>DISTRIB_S</sandelis>
<tipas>1</tipas>
<kodas>00000027</kodas>
<pavadinimas>Organiskās kapsulas Earl Grey tēja – saderīgas ar Dolce Gusto® aparātiem, 16gab.</pavadinimas>
<kiekis>1</kiekis>
<suma_v>4.050000</suma_v>
<suma_l>4.050000</suma_l>
<suma_pvmv>0.85</suma_pvmv>
<suma_pvml>0.85</suma_pvml>
<suma_nv/>
<suma_nl/>
<objektas2>DISTRIBUCI</objektas2>
<objektas3/>
<objektas6>E_MUST</objektas6>
</eilute>
<eilute>
<sandelis/>
<tipas>2</tipas>
<kodas>LOGISTIKOS_P</kodas>
<pavadinimas>Logistikos paslaugos</pavadinimas>
<kiekis>100</kiekis>
<suma_v>1.570000</suma_v>
<suma_l>1.570000</suma_l>
<suma_pvmv>0.33</suma_pvmv>
<suma_pvml>0.33</suma_pvml>
<suma_nv/>
<suma_nl/>
<objektas2>DISTRIBUCI</objektas2>
<objektas3>LOG PASL</objektas3>
<objektas6>E_MUST</objektas6>
</eilute>
</operacijaDet>
</pardavimoRezervavimas>
</fvsdata>
Ответы (1 шт):
Автор решения: Alexander Petrov
→ Ссылка
Делаем два класса-модели:
class Client
{
public int Id { get; set; }
public string Serija { get; set; }
public string Dokumentas { get; set; }
public string Pavadinimas1 { get; set; }
public string Pavadinimas2 { get; set; }
public string Pavadinimas3 { get; set; }
public string Pavadinimas4 { get; set; }
public string Pavadinimas5 { get; set; }
public string Klientas { get; set; }
public DateTime Data { get; set; }
public string Valiuta { get; set; }
}
class Detail
{
public int Id { get; set; }
public int EilNr { get; set; }
public string Sandelis { get; set; }
public int Tipas { get; set; }
public string Kodas { get; set; }
public string Pavadinimas { get; set; }
public int Kiekis { get; set; }
public decimal SumaV { get; set; }
public decimal SumaL { get; set; }
public decimal SumaPvmv { get; set; }
public decimal SumaPvml { get; set; }
}
Добавьте недостающие свойства сами.
Пример приложения с загрузкой данных из xml.
using System;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using System.Xml.Linq;
namespace WinForm
{
public partial class Form1 : Form
{
DoubleBufferedDataGridView dataGridViewMaster;
DoubleBufferedDataGridView dataGridViewDetail;
public Form1()
{
//InitializeComponent();
this.Size = new Size(1200, 800);
var xml = XElement.Load("test.xml");
//var klientas = xml.Elements("klientas").ToList();
var pardavimoRezervavimas = xml.Elements("pardavimoRezervavimas").ToList();
var clients = pardavimoRezervavimas.Select((x, i) => new Client
{
Id = i + 1,
Serija = x.Element("serija").Value,
Dokumentas = x.Element("dokumentas").Value,
Pavadinimas1 = x.Element("pavadinimas1")?.Value,
Pavadinimas2 = x.Element("pavadinimas2")?.Value,
Pavadinimas3 = x.Element("pavadinimas3")?.Value,
Pavadinimas4 = x.Element("pavadinimas4")?.Value,
Pavadinimas5 = x.Element("pavadinimas5")?.Value,
Klientas = x.Element("klientas").Value,
Data = (DateTime)x.Element("data"),
Valiuta = x.Element("valiuta").Value,
}).ToList();
var details = pardavimoRezervavimas.SelectMany((x, i) =>
x.Elements("operacijaDet").Elements("eilute").Select(eilute => new { eilute, i }))
.Select((a, j) => new Detail
{
Id = a.i + 1,
EilNr = j + 1,
Sandelis = a.eilute.Element("sandelis").Value,
Tipas = (int)a.eilute.Element("tipas"),
Kodas = a.eilute.Element("kodas").Value,
Pavadinimas = a.eilute.Element("pavadinimas").Value,
Kiekis = (int)a.eilute.Element("kiekis"),
SumaV = (decimal)a.eilute.Element("suma_v"),
SumaL = (decimal)a.eilute.Element("suma_l"),
SumaPvmv = (decimal)a.eilute.Element("suma_pvmv"),
SumaPvml = (decimal)a.eilute.Element("suma_pvml")
})
.ToList();
dataGridViewMaster = new DoubleBufferedDataGridView { Parent = this, Dock = DockStyle.Top, Height = 300 };
dataGridViewMaster.DataSource = clients;
dataGridViewDetail = new DoubleBufferedDataGridView { Parent = this, Dock = DockStyle.Bottom, Height = 400 };
dataGridViewDetail.DataSource = details;
}
}
}
Я думаю, не составит труда по аналогии добавить недостающие данные.
Грид с двойной буферизацией:
class DoubleBufferedDataGridView : DataGridView
{
protected override bool DoubleBuffered => true;
}

