【问题标题】:XML String into a DataGridView将 XML 字符串转换为 DataGridView
【发布时间】:2010-04-13 22:06:57
【问题描述】:

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

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

<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>

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

【问题讨论】:

    标签: c# xml parsing


    【解决方案1】:

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

            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 的标题

    【讨论】:

    • 工作就像一个魅力,我很感激指导!
    • 实际上,拉长报告会在 XML 中产生多个“标题”条目。对此有任何想法吗?当只发回一个标头时,Thomas 的建议非常有效。
    • 重要的是要注意
      字符串在 XML 中的每个附加情况下都是相同的,所以也许只是解析出字符串中的重复标题条目?
    • 您可以使用doc.Root.Elements("header").First() 只保留第一个&lt;header&gt; 元素
    猜你喜欢
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2012-10-10
    • 2013-03-02
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    相关资源
    最近更新 更多