如何在将XML文件转换为使用DataGridView显示的数据集时跳过属性

本文关键字:显示 DataGridView 数据集 属性 XML 文件 转换 | 更新日期: 2023-09-27 18:10:19

正如我的问题所述,

我有一个XML文件,输出如下:

<cme Type="Object" Class="cme">
<sId Type="String">1</sId>
<conc Type="Double">18,6511073619</conc>
  </cme>
<cme Type="Object" Class="cme">
<sId Type="String">2</sId>
<conc Type="Double">18,3226889524</conc>
</cme>
<cme Type="Object" Class="cme">
<sId Type="String">3</sId>
<conc Type="Double">4,7920021996</conc>
</cme>....

我在Visual Studio中创建了一个新的Form,并添加了以下代码:

        cmDataSet.ReadXml(filePath,XmlReadMode.InferSchema);
        cmDataGrid.DataSource = cmDataSet;
        cmDataGrid.AutoGenerateColumns = true;
        cmDataGrid.DataMember = "cme"; <-- Parent Node

但是当显示表单时,当行数与计数匹配时,单元格用属性的值填充,而不是实际值,如下所示:

Object  cme
Object  cme
Object  cme
Object  cme

如何跳过正在评估的属性以仅显示实际值?

如何在将XML文件转换为使用DataGridView显示的数据集时跳过属性

我认为您需要为xml文件创建xsd模式。并将cmDataSet.ReadXmlSchema调用添加到代码:

cmDataSet.ReadXmlSchema(xsdFilePath);
cmDataSet.ReadXml(filePath, XmlReadMode.InferSchema);
cmDataGrid.DataSource = cmDataSet;
cmDataGrid.AutoGenerateColumns = false;
cmDataGrid.DataMember = "cme"; <-- Parent Node

您需要schema,因为当前数据集将包含3个数据表:cme, sIdconc。这不是你想要的。

实际上,如果xml文件没有模式,它就像使用"尖括号分隔的文本"一样好,也很容易处理。

另一种方法是使用LINQ到XML并构造匿名对象(或创建强类型对象并映射到它),它将表示您的数据网格行:

var doc = XDocument.Load(filePath);
var rows = doc.Root.Elements("cme")
.Select(e => new
{
    cId = e.Element("sId").Value,
    conc = e.Element("conc").Value
});
cmDataGrid.DataSource = rows.ToList();
cmDataGrid.AutoGenerateColumns = true;

使用LINQ投影是一种快速简便的显示数据的方法,但在执行"添加/更新/编辑行"场景时,您可能会浪费大量时间。