使用 Linq 查询 XML 文档

Posted

技术标签:

【中文标题】使用 Linq 查询 XML 文档【英文标题】:Querying XML document using Linq 【发布时间】:2012-10-31 02:44:27 【问题描述】:

我正在尝试 Linq 一个 xml 文档,我无法查询内部元素,正如您从下面的代码中看到的那样,我正在尝试做什么。我想获取所有具有特定名称的记录...请帮助。

<?xml version="1.0" encoding="utf-8" ?>
<Student>

 <Person name="John" city="Auckland" country="NZ" />

 <Person>
    <Course>GDICT-CN</Course>
    <Level>7</Level>
    <Credit>120</Credit>
    <Date>129971035565221298</Date>
 </Person>
 <Person>
    <Course>GDICT-CN</Course>
    <Level>7</Level>
    <Credit>120</Credit>
    <Date>129971036040828501</Date>
 </Person>
</Student>

现在是来源

class Program

  static void Main(string[] args)
  
     string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
     XDocument xDoc = XDocument.Load(path + "\\Student Data\\data.xml");

     IEnumerable<XElement> rows = 
        from row in xDoc.Descendants("Person")
             where (string)row.Attribute("Course") == "GDICT-CN"
             select row;

     foreach(XElement xEle in rows)
     
        IEnumerable<XAttribute>attlist = 
          from att in xEle.DescendantsAndSelf().Attributes() 
               select att;

        foreach(XAttribute xatt in attlist)
        
            Console.WriteLine(xatt);
        
        foreach (XElement elemnt in xEle.Descendants())
        
             Console.WriteLine(elemnt.Value);
        
        Console.WriteLine("-------------------------------------------");
      
   Console.ReadLine();
  
 

【问题讨论】:

【参考方案1】:

用这个替换你的 LINQ where 查询 -

IEnumerable<XElement> rows = xDoc.Descendants().Where(d => d.Name == "Person"
                               && d.Descendants().Any(e => e.Name == "Course"
                                 && e.Value == "GDICT-CN"));

【讨论】:

如前所述,您应该查看Descendants 而不是Attributes

以上是关于使用 Linq 查询 XML 文档的主要内容,如果未能解决你的问题,请参考以下文章

如何/我可以使用 linq to xml 以合理的内存消耗查询巨大的 xml 文件?

Linq示例

LINQ to XML概述

2019年 7月16日 Linq高级查询

使用 LINQ 查询 XDocument 的最佳方法?

语言集成查询 (LINQ)