簡體   English   中英

從不同的XML元素創建相同的LINQ匿名類型

[英]Create same LINQ anonymous type from different XML element

我有一個這樣的XML文件: - XML文件

請注意,每個<Field></Field>可以具有不同的元素,如突出顯示的<I32><String> 我想在datagridview中顯示元素名稱,其中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來編寫它,但上面的內容在此上下文中更具可讀性,因為原始查詢中的附加投影會增加噪音和潛在的混淆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM