如何防止具有相同名称但在 uppre/lower 情况下不同的列的重复行数据?
How to prevent duplicate row data for columns with same names but different in uppre/lower case?
我有一个这样的 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 属性名称的名称创建 table 列: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" 列重复。所以它 skips/ignores "ID" 属性的真实 data/value。
如何防止这种重复并获取 "ID" 属性的值并将它们显示为列 "ID" 下的行?
尝试通过 StreamReader 在 table 上输出结果:
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"!!
我测试了你的代码,它似乎工作正常。我在您的代码中发现的唯一问题是在解析 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();
}
}
}
进行此更改后的输出:
请注意,上图中这段代码的输出是在调试过程中。我向您展示了 运行 代码返回的数据 Table。另外请根据您的环境更改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();
}
我有一个这样的 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 属性名称的名称创建 table 列: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" 列重复。所以它 skips/ignores "ID" 属性的真实 data/value。
如何防止这种重复并获取 "ID" 属性的值并将它们显示为列 "ID" 下的行?
尝试通过 StreamReader 在 table 上输出结果:
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"!!
我测试了你的代码,它似乎工作正常。我在您的代码中发现的唯一问题是在解析 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();
}
}
}
进行此更改后的输出:
请注意,上图中这段代码的输出是在调试过程中。我向您展示了 运行 代码返回的数据 Table。另外请根据您的环境更改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();
}