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

标签 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">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.Value,
                                Type = item.Value

                            };

                dataGridView1.DataSource = lines.ToArray();

这是我得到的结果...

enter image description here

我想要的结果是......

enter image description here

我认为可能有效的代码...

 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();

我收到的错误是...

"Object reference not set to an instance of an object."

最佳答案

您的代码的问题是:-

item.Attribute("field").Value  //this line

只需查看您的第一个查询,它就会返回该结果,因为 item 表示每个 line 节点及其内部存在的相应 field 节点。例如,第一个项目将是:-

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

等等...

现在,在第二个查询中,当您说 item.Attribute("field").Value 时,它将抛出 Null 引用异常,因为每个 item 不包含属性field(如上所示),而是一个元素。所以你应该写 item.Element("field") 来代替。但是,这仍然不会给您预期的结果,因为您想要根据属性值 Descriptionname 获取数据。您可以这样编写查询:-

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"),
                };

说明:

xdoc.Descendants("line") 将获取所有行节点,如上所示,现在在其中我们需要找到所有fields 节点,以便我们存储它在名为 fields 的变量中。最后,在投影时,我使用 FirstOrDefault 方法来获取第一个匹配的 name 属性,其值为 DescriptionType并获取它的值。

关于c# - 使用 linq to XML 将 xml 文件导入到 datagridview。数据显示不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33549462/

相关文章:

c# - httpclient.GetStringAsync(url) 异步 api 调用的异常处理

c# - 在 Razor View 中的 ASP.NET WEB API 中获取路由前缀的 URL

java - 如何读取xsi :type with java annotations

java - 减少 log4j.xml 中 Tomcat Digester 记录器的冗长程度

c# - 通过 LINQ 插入数据时出现重复键错误但找不到具有相同值的条目

c# - 是否有可能 "intercept"第三方库的 "WriteFile"操作

c# - 判断当前时间是否在多个时间跨度之间

c# - 如何从 List<String[]> 创建一个 csv 文件

xml - 使用 NLog 在 Mongo 数据库中存储日志

c# - 在 Group By 中使用表达式树后无法选择