c# - XML 字符串到 DataGridView

标签 c# xml parsing

我目前正在使用网络服务来提取有关远程支持系统中用户的报告。

拉取我的报告并收到结果后,通过方法返回以下字符串:

<report>
    <header>
        <field id="0">Source</field>
        <field id="1">Session ID</field>
        <field id="2">Date</field>
        <field id="3">Name</field>
        <field id="24">Technician Name</field>
        <field id="25">Technician ID</field>
    </header>
    <data>
        <row>
            <field id="0">Email</field>
            <field id="1">55037806</field>
            <field id="2">4/13/2010 2:28:06 AM</field>
            <field id="3">Bill Gates</field>
            <field id="24">John</field>
            <field id="25">1821852</field>
        </row>
        <row>
            <field id="0">Telephone</field>
            <field id="1">55034548</field>
            <field id="2">4/13/2010 12:59:44 AM</field>
            <field id="3">Steve Jobs</field>
            <field id="24">John</field>
            <field id="25">1821852</field>
        </row>
    </data>
</report>

收到这个字符串后,我需要获取它并在数据 GridView 中显示实际数据。我试过将它放入 XMLDocument 然后读取它,但它似乎一直在失败。只是对另一双眼睛感兴趣 :) 应用程序是在 VS2010 中用 C# 编写的。

最佳答案

您可以使用 Linq to XML 使用 XML 文件中的列名称构建一个 DataTable,然后将该表设置为 DataGridView< 的 DataSource/ :

        string xml = theWebService.TheMethod();
        XDocument doc = XDocument.Parse(xml);
        var queryHeaders =
            from field in doc.Root.Element("header").Elements("field")
            select new
            {
                Id = field.Attribute("id").Value,
                Name = field.Value
            };

        var headers = queryHeaders.ToDictionary(f => f.Id, f => f.Name);

        DataTable table = new DataTable();
        foreach (var kvp in headers)
        {
            table.Columns.Add(kvp.Value);
        }

        Func<XElement, DataRow> rowGenerator =
            element =>
            {
                var row = table.NewRow();
                foreach (var field in element.Elements("field"))
                {
                    string fieldId = field.Attribute("id").Value;
                    string columnName = headers[fieldId];
                    string value = field.Value;
                    row[columnName] = value;
                }
                return row;
            };

        var rows =
            from rowElement in doc.Root.Element("data").Elements("row")
            select rowGenerator(rowElement);

        foreach (var row in rows)
        {
            table.Rows.Add(row);
        }

        dataGridView.AutoGenerateColumns = true;
        dataGridView.DataSource = table;

请注意,上面的代码仅在所有字段都具有不同名称的情况下才有效。如果不是这种情况,您可能希望使用字段 ID 作为 DataColumn 名称,并使用实际字段名称更改 DGV 的 header

关于c# - XML 字符串到 DataGridView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2633548/

相关文章:

c# - 接口(interface)和对象反序列化

Android.view.InflateException问题

javascript - Safari 中的日期解析错误

javascript - 解析嵌套的 JSON 响应 Javascript

c# - ASP.NET Web 应用程序 'Could not load the assembly ' App_Web_'

c# - SqlConnection/SqlCommand 在 Close 和 Dispose 后保持数据库处于使用状态

json - REST API 返回 JSON/XML 以外的内容是否可以接受?

javascript - 无法使用javascript解析json

c# - JSON.net 父键

java - 显示自定义 map 并在 map 上放置图钉/图像