gpt4 book ai didi

c# - 从不同的 XML 元素创建相同的 LINQ 匿名类型

转载 作者:数据小太阳 更新时间:2023-10-29 02:23:20 26 4
gpt4 key购买 nike

我有一个这样的 XML 文件:- XML file

注意每个 <Field></Field>可以有不同的元素,如突出显示的 <I32><String> .我想在这样的数据 GridView 中显示元素名称,其中 Type 用于元素名称(I32 或 String 或 <Field> 的其他子元素):- Datagridview

到目前为止,我已经尝试过这段代码,但它返回了 An unhandled exception of type 'System.NullReferenceException' .

XDocument doc = XDocument.Load("GetLotDetails.xml");
var data = doc.Descendants("Document").Where(x => (String)x.Attribute("name") == "DATA").SelectMany(x => x.Elements("Field"));
var query = from d in data
let str = d.Element("String").Name
let other = d.Element("I32").Name
select new
{
Name = d.Attribute("name").Value,
Type = str.Equals("String") ? "String" : (other.Equals("I32") ? "I32" : null),
Value = d.Value,
};
dataGridView1.DataSource = query.ToList();

所以想法是让匿名Type = *whatever element name under field* .如何在 LINQ select 语句中提取不同名称的元素并将其赋予相同的未知类型变量?

最佳答案

它与匿名类型无关。您缺少空检查

var query = 
from d in data
let element = d.Element("String") ?? d.Element("I32")
select new
{
Name = d.Attribute("name").Value,
Type = element?.Name,
d.Value
};

在您的原始查询中,您无条件地从两个可能的节点读取 Name,但对于任何给定的 d,其中一个节点将为 null。我本可以使用 null 条件运算符 d.Element("String")?.Name 来编写它,但在这种情况下,上面的内容更具可读性,因为原始查询中的额外投影会增加噪音和潜在的混淆。

关于c# - 从不同的 XML 元素创建相同的 LINQ 匿名类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53147330/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com