C # импорт xml в listview

#c# #xml #listview

#c# #xml #listview

Вопрос:

прежде всего, я новичок, и я все еще изучаю C #. На данный момент я пытаюсь создать приложение, в котором одним из вариантов будет импортировать XML-файл в listview. XML-файл, который мне нужно импортировать, всегда находится в одном и том же формате. Проблема, с которой я сталкиваюсь, заключается в том, что каждый узел этого xml-файла имеет 2 дополнительных атрибута внутри одного узла, и когда я импортирую его в listview, он читает только первую часть, он читает до тех пор, пока не достигнет нового атрибута, который в основном является частью того же узла.

Ниже приведен XML-документ, из которого мне нужно импортировать следующую информацию:

  1. Банковский счет
  2. Имя клиента
  3. Фамилия клиента
  4. Идентификатор заказа
  5. Возвращаемый идентификатор
  6. Количество
  7. Адрес
 <?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. Большое вам спасибо за помощь.