![](/img/trans.png)
[英]Linq to XML: create an anonymous object with element attributes and values
[英]Create same LINQ anonymous type from different XML element
請注意,每個<Field></Field>
可以具有不同的元素,如突出顯示的<I32>
或<String>
。 我想在datagridview中顯示元素名稱,其中Type是元素的名稱(I32或String或<Field>
其他子元素): -
到目前為止,我已經嘗試了這段代碼,但它返回了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
來編寫它,但上面的內容在此上下文中更具可讀性,因為原始查詢中的附加投影會增加噪音和潛在的混淆。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.