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

时间:2013-04-22 21:00:23

标签: c# xml linq-to-dataset

如我的问题所述,

我有一个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中创建了一个新表单,并添加了以下代码:

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

但是当显示表单时,行数与计数匹配, 通过这种方式,单元格用属性值填充,而不是实际值:

Object  cme
Object  cme
Object  cme
Object  cme

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

1 个答案:

答案 0 :(得分:1)

我相信您需要为xml文件创建xsd架构。并将cmDataSet.ReadXmlSchema调用添加到代码中:

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

您需要架构,因为目前数据集将包含3个DataTables:cmesIdconc。这不是你想要的。

实际上,如果xml文件没有架构,那么它与使用“尖括号分隔文本”一样好,易于使用。

另一种方法是使用LINQ to 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投影是一种快速简便的数据显示方式,但在实施“添加/更新/编辑行”方案时可能会浪费大量时间。