我得到了一个 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();
请注意 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>
谢谢
最佳答案
您需要使用 let
clause .它在查询中创建一个新变量,并允许多次使用它。
在你的情况下是
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();
请注意,它是基于纯 LINQ 语法的代码,与使用问题中的扩展方法相比,它可以让您更清楚地表达想法。
关于c# - 使用 LINQ 读取 XML 时防止重复元素访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7140470/