Как предотвратить дублирование данных строки для столбцов с одинаковыми именами, но разными в верхнем / нижнем регистре? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть XML-файл, подобный следующему:

<?xml version="1.0" encoding="UTF-8"?>
<Logging S="T006" version="2" >
<Log Date="2018-11-21" Severity="Error" id="22" ID="Opened" Msg="some text"/>
<Log Date="2018-11-21" Severity="Info" id="76" ID="Auth"/>
<Log Date="2018-11-21" Severity="Info" id="60" ID="Up"/>
<Log Date="2018-11-21" Severity="Warning" id="22" ID="Opened" Msg="some text"/>
<Log Date="2018-11-21" Severity="Info" id="96" ID="Locked"/>
<Log Date="2018-11-21" Severity="Info" id="84" ID="Done"/>
<Log Date="2018-11-21" Severity="Info" id="57" ID="Idle"/>
<Log Date="2018-11-21" Severity="Error" id="10" ID="Inspected" Pos="12"/>
<Log Date="2018-11-21" Severity="Info" id="148" ID="Started"/>
</Logging>

Для отображения данных из этого файла в datagridview.Я создаю столбцы таблицы, используя имена атрибутов xml: Date, Severity, id, ID.

DataTable dt = new DataTable();
dt.Columns.Add("Date", typeof(DateTime));
dt.Columns.Add("Severity", typeof(string));
dt.Columns.Add("id", typeof(string));
dt.Columns.Add("ID", typeof(string));
dt.Columns.Add("Msg", typeof(string));

XDocument docLog = XDocument.Load(XML_FILEPATH);

foreach (XElement log in docLog.Descendants("Log"))
{

   DateTime date = (DateTime)log.Attribute("Date");
   string severity = (string)log.Attribute("Severity");
   string id = (string)log.Attribute("id");
   string ID = (string)log.Attribute("ID");
   string msg = (string)log.Attribute("Msg");

   dt.Rows.Add(new object[] { date, severity, id, ID, msg });
}

Но отображаемые данные показывают строки столбца «id» и дублируют то же самое для столбца «ID».поэтому он пропускает / игнорирует реальные данные / значение атрибутов "ID".

the output table

Как я могу предотвратить это дублирование и получить значенияАтрибуты «ID» и отображают их в виде строк под столбцом «ID»?

, пытаясь вывести результат в таблицу с помощью StreamReader:

 OpenFileDialog openFileDialog1 = new OpenFileDialog();

        openFileDialog1.Filter = @"All files (*.*)|*.*";
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            myLogfile = openFileDialog1.FileName;
            StreamReader sr = new StreamReader(openFileDialog1.FileName);
            var dataset = new DataSet();
            dataset.ReadXml(sr);

            var bindingSource = new BindingSource
            {
                DataSource = dataset,
                DataMember = "Log"
            };
            dataGridView1.DataSource = bindingSource;

, но это также дублирует значения «id»"в" ID "!!

1 Ответ

0 голосов
/ 27 февраля 2019

Я проверил ваш код, и он, кажется, работает правильно.Единственная проблема, с которой я столкнулся с вашим кодом, - это разбор XML-документа для DateTime вместо:

DateTime date = (DateTime)log.Attribute("DT");

Измените его на:

DateTime date = (DateTime)log.Attribute("Date");

Я проверил это наконсольное приложение.Код здесь:

using System;
using System.Data;
using System.Xml.Linq;

namespace Example
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Date", typeof(DateTime));
            dt.Columns.Add("Severity", typeof(string));
            dt.Columns.Add("id", typeof(string));
            dt.Columns.Add("ID", typeof(string));
            dt.Columns.Add("Msg", typeof(string));

            XDocument docLog = XDocument.Load("test.xml");

            foreach (XElement log in docLog.Descendants("Log"))
            {

                DateTime date = (DateTime)log.Attribute("Date");
                string severity = (string)log.Attribute("Severity");
                string id = (string)log.Attribute("id");
                string ID = (string)log.Attribute("ID");
                string msg = (string)log.Attribute("Msg");

                dt.Rows.Add(new object[] { date, severity, id, ID, msg });
            }
            foreach (DataRow dataRow in dt.Rows)
            {
                foreach (var item in dataRow.ItemArray)
                {
                    Console.WriteLine(item);

                }
            }
            Console.ReadLine();
        }
    }
}

Вывод после внесения этого изменения:

enter image description here

Обратите внимание, что вывод этого кода ввыше изображение находится в процессе отладки.Я показал вам, какую Таблицу Данных возвращали, запустив код.Также, пожалуйста, измените FILEPATH в соответствии с вашей средой.

        foreach (DataRow row in dt.Rows)
        {
            string date = row["Date"].ToString();
            string severity = row["Severity"].ToString();
            string id = row["id"].ToString();
            string ID = row["ID"].ToString();
            string msg = row["Msg"].ToString();
        }
...