#c# #xml #listview
#c# #xml #listview
Вопрос:
прежде всего, я новичок, и я все еще изучаю C #. На данный момент я пытаюсь создать приложение, в котором одним из вариантов будет импортировать XML-файл в listview. XML-файл, который мне нужно импортировать, всегда находится в одном и том же формате. Проблема, с которой я сталкиваюсь, заключается в том, что каждый узел этого xml-файла имеет 2 дополнительных атрибута внутри одного узла, и когда я импортирую его в listview, он читает только первую часть, он читает до тех пор, пока не достигнет нового атрибута, который в основном является частью того же узла.
Ниже приведен XML-документ, из которого мне нужно импортировать следующую информацию:
- Банковский счет
- Имя клиента
- Фамилия клиента
- Идентификатор заказа
- Возвращаемый идентификатор
- Количество
- Адрес
<?xml version="1.0" encoding="UTF-8"?>
<RETURN_POD_EXPORT_INFO>
<RETURN_TYPE>1</RETURN_TYPE>
<BRAND>UAUA</BRAND>
<ECOM_VIRTUAL_STORE>11111</ECOM_VIRTUAL_STORE>
<COUNTRY_ISO>RS</COUNTRY_ISO>
<CURRENCY>CCC</CURRENCY>
<GENERATION_DATE>2020-05-14 05:05:11</GENERATION_DATE>
<TOTAL_RETURN_AMOUNT>284433.0</TOTAL_RETURN_AMOUNT>
<TOTAL_RETURN_LINES>3</TOTAL_RETURN_LINES>
<RETURNS>
<RETURN>
<RETURN_ID>133175067</RETURN_ID>
<ORDER_ID>52061583816</ORDER_ID>
<RETURN_AMOUNT>2590.0</RETURN_AMOUNT>
<OPERATION_DATE>2020-05-13 23:27:03</OPERATION_DATE>
<CUSTOMER_NAME><![CDATA[NAME1]]></CUSTOMER_NAME>
<CUSTOMER_SURNAME><![CDATA[SURNAME1]]></CUSTOMER_SURNAME>
<BANK>
<CUSTOMER_BANK_ACCOUNT><![CDATA[165111152438543892]]></CUSTOMER_BANK_ACCOUNT>
</BANK>
<ADDRESS>
<ADDRESS_LINE_1><![CDATA[ADDRESS12]]></ADDRESS_LINE_1>
<ADDRESS_LINE_2 />
<POST_CODE><![CDATA[11111]]></POST_CODE>
<CITY><![CDATA[CITY1]]></CITY>
<PROVINCE />
<COUNTRY><![CDATA[xx1]]></COUNTRY>
</ADDRESS>
</RETURN>
<RETURN>
<RETURN_ID>132774698</RETURN_ID>
<ORDER_ID>52052842870</ORDER_ID>
<RETURN_AMOUNT>2590.0</RETURN_AMOUNT>
<OPERATION_DATE>2020-05-13 23:27:03</OPERATION_DATE>
<CUSTOMER_NAME><![CDATA[NAME2]]></CUSTOMER_NAME>
<CUSTOMER_SURNAME><![CDATA[SURNAME2]]></CUSTOMER_SURNAME>
<BANK>
<CUSTOMER_BANK_ACCOUNT><![CDATA[161513116237644624]]></CUSTOMER_BANK_ACCOUNT>
</BANK>
<ADDRESS>
<ADDRESS_LINE_1><![CDATA[ADDRESS2]]></ADDRESS_LINE_1>
<ADDRESS_LINE_2 />
<POST_CODE><![CDATA[22222]]></POST_CODE>
<CITY><![CDATA[CITY2]]></CITY>
<PROVINCE />
<COUNTRY><![CDATA[xx2]]></COUNTRY>
</ADDRESS>
</RETURN>
<RETURN>
<RETURN_ID>132957033</RETURN_ID>
<ORDER_ID>51724252579</ORDER_ID>
<RETURN_AMOUNT>1290.0</RETURN_AMOUNT>
<OPERATION_DATE>2020-05-13 23:27:03</OPERATION_DATE>
<CUSTOMER_NAME><![CDATA[NAME3]]></CUSTOMER_NAME>
<CUSTOMER_SURNAME><![CDATA[SURNAME3]]></CUSTOMER_SURNAME>
<BANK>
<CUSTOMER_BANK_ACCOUNT><![CDATA[162519814237644124]]></CUSTOMER_BANK_ACCOUNT>
</BANK>
<ADDRESS>
<ADDRESS_LINE_1><![CDATA[ADDRESS3]]></ADDRESS_LINE_1>
<ADDRESS_LINE_2 />
<POST_CODE><![CDATA[3333]]></POST_CODE>
<CITY><![CDATA[CITY3]]></CITY>
<PROVINCE />
<COUNTRY><![CDATA[xx3]]></COUNTRY>
</ADDRESS>
</RETURN>
<RETURN>
<RETURN_ID>133244875</RETURN_ID>
<ORDER_ID>51729778357</ORDER_ID>
<RETURN_AMOUNT>2590.0</RETURN_AMOUNT>
<OPERATION_DATE>2020-05-13 23:27:03</OPERATION_DATE>
<CUSTOMER_NAME><![CDATA[NAME4]]></CUSTOMER_NAME>
<CUSTOMER_SURNAME><![CDATA[SURNAME4]]></CUSTOMER_SURNAME>
<BANK>
<CUSTOMER_BANK_ACCOUNT><![CDATA[169515511237644324]]></CUSTOMER_BANK_ACCOUNT>
</BANK>
<ADDRESS>
<ADDRESS_LINE_1><![CDATA[ADDRESSS4]]></ADDRESS_LINE_1>
<ADDRESS_LINE_2 />
<POST_CODE><![CDATA[4444]]></POST_CODE>
<CITY><![CDATA[CITY4]]></CITY>
<PROVINCE />
<COUNTRY><![CDATA[XX4]]></COUNTRY>
</ADDRESS>
</RETURN>
</RETURNS>
</RETURN_POD_EXPORT_INFO>
Кроме того, ниже приведен код, который я делал до сих пор, но проблема в том, что он считывает только информацию о первом «ВОЗВРАТЕ» узла, он не загружает информацию со всех 231 ВОЗВРАЩАЕМЫХ узлов в XML.
foreach (XmlNode xmlNode in doc.SelectNodes("//RETURN"))
{
XmlNode node1 = doc.SelectSingleNode("RETURN_POD_EXPORT_INFO/RETURNS/RETURN/BANK/CUSTOMER_BANK_ACCOUNT");
string bank = node1.InnerText;
XmlNode node2 = doc.SelectSingleNode("RETURN_POD_EXPORT_INFO/RETURNS/RETURN/CUSTOMER_NAME");
string name = node2.InnerText;
XmlNode node3 = doc.SelectSingleNode("RETURN_POD_EXPORT_INFO/RETURNS/RETURN/CUSTOMER_SURNAME");
string surname = node3.InnerText;
XmlNode node4 = doc.SelectSingleNode("RETURN_POD_EXPORT_INFO/RETURNS/RETURN/ORDER_ID");
string orderid = node4.InnerText;
XmlNode node5 = doc.SelectSingleNode("RETURN_POD_EXPORT_INFO/RETURNS/RETURN/RETURN_ID");
string returnid = node5.InnerText;
XmlNode node6 = doc.SelectSingleNode("RETURN_POD_EXPORT_INFO/RETURNS/RETURN/RETURN_AMOUNT");
string amount = node6.InnerText;
XmlNode node7 = doc.SelectSingleNode("RETURN_POD_EXPORT_INFO/RETURNS/RETURN/ADDRESS/CITY");
string city = node7.InnerText;
ListViewItem item = new ListViewItem(bank);
item.SubItems.Add(name " " surname);
item.SubItems.Add(city);
item.SubItems.Add("ONLINE POVRAT");
item.SubItems.Add(orderid);
item.SubItems.Add(amount);
item.SubItems.Add(returnid);
listView1.Items.Clear();
listView1.Items.Add(item);
}
Я ценю вашу помощь и советы.
Ответ №1:
Попробуйте xml linq. Вы можете сделать источник данных listview доступным для данных. Использование datatable сохраняет типы и упрощает добавление в элемент управления.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication172
{
class Program
{
const string FILENAME = @"c:temptest.xml";
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("Bank account", typeof(string));
dt.Columns.Add("Customer Name", typeof(string));
dt.Columns.Add("Customer Surname", typeof(string));
dt.Columns.Add("Order ID", typeof(long));
dt.Columns.Add("Return ID", typeof(long));
dt.Columns.Add("Amount", typeof(decimal));
dt.Columns.Add("Address_1", typeof(string));
dt.Columns.Add("Address_2", typeof(string));
dt.Columns.Add("Post Code", typeof(string));
dt.Columns.Add("City", typeof(string));
dt.Columns.Add("Providence", typeof(string));
dt.Columns.Add("Country", typeof(string));
XDocument doc = XDocument.Load(FILENAME);
foreach(XElement xReturn in doc.Descendants("RETURN"))
{
dt.Rows.Add(new object[] {
(string)xReturn.Descendants("CUSTOMER_BANK_ACCOUNT").FirstOrDefault(),
(string)xReturn.Element("CUSTOMER_NAME"),
(string)xReturn.Element("CUSTOMER_SURNAME"),
(long)xReturn.Element("ORDER_ID"),
(long)xReturn.Element("RETURN_ID"),
(string)xReturn.Element("RETURN_AMOUNT"),
(string)xReturn.Descendants("ADDRESS_LINE_1").FirstOrDefault(),
(string)xReturn.Descendants("ADDRESS_LINE_2").FirstOrDefault(),
(string)xReturn.Descendants("POST_CODE").FirstOrDefault(),
(string)xReturn.Descendants("CITY").FirstOrDefault(),
(string)xReturn.Descendants("PROVINCE").FirstOrDefault(),
(string)xReturn.Descendants("COUNTRY").FirstOrDefault()
});
}
}
}
}
Комментарии:
1. Большое вам спасибо за помощь.