C# 使用linq to xml将xml文件导入datagridview。数据显示不正确

C# 使用linq to xml将xml文件导入datagridview。数据显示不正确,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我的XML文件 <?xml version="1.0" encoding="UTF-8"?> <files> <file type="main"> <document>Report.pdf</document> <field name="Company">Northwind</field> <field name="Description">mont

我的XML文件

<?xml version="1.0" encoding="UTF-8"?>
<files>
        <file type="main">
<document>Report.pdf</document>
         <field name="Company">Northwind</field>
         <field name="Description">monthly report</field>
         <line>
               <field name="Description">Error</field>
               <field name="Type">4444</field>
         </line>
         <line>
               <field name="Description">Info</field>
               <field name="Type">4562</field>
         </line>
         <line>
               <field name="Description">Error</field>
               <field name="Type">2135</field>
         </line>
          <field name="Analyst">Bob</field>
          <field name="Manager">Steve</field>
          <field name="Dept">Finance</field>
          </file>
</files>
这是我得到的结果

我想要的结果是

我认为可能有用的代码

 XElement xdoc = XElement.Load(@"C:\xmltest\input.xml");

                var lines = from item in xdoc.Descendants("line")

                            select new
                            {
                                Description = item.Attribute("field").Value,
                                Type = item.Value

                            };

                dataGridView1.DataSource = lines.ToArray();
我收到的错误是

“对象引用未设置为对象的实例。”


您可以尝试按属性进行过滤,如下所示:

XElement xdoc = XElement.Load(@"XMLFile1.xml");

var lines = from item in xdoc.Descendants("line")
            select new
            {
                Description = item.Elements("field").Where(e => (string)e.Attribute("name") == "Description").First().Value,
                Type = item.Elements("field").Where(e => (string)e.Attribute("name") == "Type").First().Value
            };

var array = lines.ToArray();

foreach (var item in array)
{
    Console.WriteLine($"{item.Description}\t{item.Type}");
}
它将产生以下结果:

Error   4444
Info    4562
Error   2135   
数据集呢

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        const string FILENAME = @"\temp\test.xml";
        public Form1()
        {
            InitializeComponent();

            DataSet ds = new DataSet();
            ds.ReadXml(FILENAME);

            dataGridView1.DataSource = ds.Tables[1];
        }
    }
}
​

您的代码存在以下问题:-

item.Attribute("field").Value  //this line
只需查看您的第一个查询,它将返回该结果,因为
表示每个
节点,其中包含相应的
字段
节点。例如,假设第一个
项目将是:-

<line>
  <field name="Description">Error</field>
  <field name="Type">4444</field>
</line>
说明:


xdoc.substands(“line”)
将获取上面演示的所有行节点,现在我们需要在其中找到所有
字段
节点,因此我们将其存储在名为
字段
的变量中。最后,在投影时,我使用了
FirstOrDefault
方法来获取第一个匹配的
name
属性,该属性的值为
Description
Type
,并获取它的值。

谢谢,效果很好,我知道现在发生了什么:)。
<line>
  <field name="Description">Error</field>
  <field name="Type">4444</field>
</line>
var lines = from item in xdoc.Descendants("line")
            let fields = item.Elements("field")
            select new
                {
                   Description = (string)fields
                       .FirstOrDefault(n => (string)n.Attribute("name") == "Description"),
                   Type = (string)fields
                       .FirstOrDefault(n => (string)n.Attribute("name") == "Type"),
                };