C# 使用linq to xml将xml文件导入datagridview。数据显示不正确
我的XML文件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 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"),
};