【问题标题】:How to prevent duplicate row data for columns with same names but different in uppre/lower case?如何防止具有相同名称但大小写不同的列的重复行数据?
【发布时间】:2019-02-27 13:33:42
【问题描述】:

我有一个这样的 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”属性的真实数据/值。

如何防止这种重复并获取“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”中!!

【问题讨论】:

    标签: c# xml datatable linq-to-xml


    【解决方案1】:

    我测试了您的代码,它似乎工作正常。我在您的代码中发现的唯一问题是在为 DateTime 解析 XML 文档期间,而不是:

    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();
            }
        }
    }
    

    进行此更改后的输出:

    请注意,上图中这段代码的输出是在调试过程中。我向您展示了通过运行代码返回的数据表。另外请根据您的环境更改 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();
            }
    

    【讨论】:

    • 感谢您的回复。是的,在帖子中我犯了一个语法错误,但是您能否发布您为获取此表而运行的整个代码?谢谢。
    • 这很奇怪。在 windows 窗体应用程序中我没有得到这个结果,我也尝试了简单的 StreamReader 也将 id 的结果复制到 ID
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 2012-01-26
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多