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

标签 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();

请注意 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/

相关文章:

c# - 过滤强类型结果

c# - 如何声明 Linq 表达式变量以便将其作为 dbParameter 处理

c# - Java 和 C# 中的内存管理有何不同?

c# - 从 32 位代码在 System32 中运行 64 位可执行文件

java - 调用采用大型 XML 文件作为参数的 SQL 过程的最佳方法是什么?

sql - 用于Nullable <T>的LINQ-to-SQL IN/Contains()

c# - 如何使用 Linq2Sql 模拟 "In"

c# - 用于上传图像文件的 ServiceStack 端点

java - 在 Android 中重现一个简单的 Foreach 循环?

c# - WCF 如何将 List<T> 作为 XML 请求发送