使用LINQ读取XML时防止重复元素访问

Sim*_*Max 2 c# xml linq linq-to-xml

我有一个XML,我正在尝试使用LINQ to XML解析并将其转换为匿名的对象列表.为此,我想出了以下代码片段:

var res = doc
            .Root
            .Elements("Record")
            .Elements("Term")
            .Select(term => new
            {
                LanguageCode = term.Attribute("languageCode").Value,
                ConceptNumber = Convert.ToInt32(term.Attribute("conceptNumber").Value),
                IsHidden = Convert.ToBoolean(term.Attribute("hidden").Value),
                Label = term.Value,

                InputDate = DateTime.Parse(term.Parent.Element("InputDate").Value),
                LastUpdate = DateTime.Parse(term.Parent.Element("LastUpdated").Value)
            }).ToList();
Run Code Online (Sandbox Code Playgroud)

请注意InputDate和LastUpdate部分.如您所见,我将访问父节点(例如,term.Parent),以便我可以访问这两个元素,这看起来很混乱.有没有办法声明term.Parent一次并反复使用它来提取这些属性?

这是我试图阅读的XML的摘录:

<Record>
  <Term  languageCode="Prs" conceptNumber="10" hidden="False">Whatever</Term>
  <Status>Approved</Status>
  <Frequency>0</Frequency>
  <InputDate>12/30/1899</InputDate>
  <LastUpdate>10/25/2009</LastUpdate>
</Record>
Run Code Online (Sandbox Code Playgroud)

谢谢

Kyr*_*o M 6

你需要使用let条款.它在查询中创建一个新变量,并允许多次使用它.

在你的情况下,它会

var res = (from term in doc.Root.Elements("Record").Elements("Term")
           let parent = term.Parent
           select new
           {
               LanguageCode = term.Attribute("languageCode").Value,
               ConceptNumber = Convert.ToInt32(term.Attribute("conceptNumber").Value),
               IsHidden = Convert.ToBoolean(term.Attribute("hidden").Value),
               Label = term.Value,
               InputDate = parent.Element("InputDate").Value,
               LastUpdate = parent.Element("LastUpdated").Value
           }).ToList();
Run Code Online (Sandbox Code Playgroud)

请注意,它是一个纯LINQ语法的代码,它允许您比使用问题中的扩展方法更清晰地表达想法.