繁体   English   中英

具有元素和属性的C#XML降序

[英]C# XML Descending order with elements and attributes

我需要从一个xml文件中找到5个最大的学生

我的xml文件看起来像这样

<Professor id="Andy">
<Floor nb="1">
  <data>
    <Room>101</Room>
    <Nbstudent>33724</Nbstudent>
  </data>
      </Floor>
</Professor >
  <Professor id="Mick">
<Floor nb="2">
  <data>
    <Room>102</Room>
    <Nbstudent>33740</Nbstudent>
  </data>
  </Floor>
</Professor >

现在我的代码是

var xdoc = XDocument.Load("student.xml");
var student=
           (from r in xdoc.Descendants("data")
           orderby int.Parse(r.XPathSelectElement("Nbstudent").Value) descending
          select new
          {
           Name = r.XPathSelectElement("//Professor").Attribute("id").Value + "   ",
           Room= r.XPathSelectElement("Room").Value + "   ",
           NB= r.XPathSelectElement("Nbstudent").Value + "    ",
                  })
     .Take(5);
foreach (var r in student)
            {
                Console.WriteLine(r.Name + r.Room+ r.NB);
            }

它确实找到了我想要的5个值,但Name总是返回相同的值(即使之后的数据不属于此属性。

我不知道如何获得正确的属性。

可以通过最小程度地更改原始代码来解决问题的另一种可能的选择:

Name = r.XPathSelectElement("ancestor::Professor[1]").Attribute("id").Value + "   ",

尝试这个:

var student =
(from r in xdoc.Descendants("Professor")
orderby int.Parse(r.XPathSelectElement("Floor/data/Nbstudent").Value) descending
select new
{
    Name = r.Attribute("id").Value + "   ",
    Room = r.XPathSelectElement("Floor/data/Room").Value + "   ",
    NB = r.XPathSelectElement("Floor/data/Nbstudent").Value + "    ",
})
.Take(5);

请注意,您可以像这样简化整数解析:

var student =
(from r in xdoc.Descendants("Professor")
orderby (int)r.XPathSelectElement("Floor/data/Nbstudent") descending
select new
{
    Name = r.Attribute("id").Value + "   ",
    Room = r.XPathSelectElement("Floor/data/Room").Value + "   ",
    NB = r.XPathSelectElement("Floor/data/Nbstudent").Value + "    ",
})
.Take(5);
    var student =
   (from r in xdoc.Descendants("Professor")
orderby int.Parse(r.XPathSelectElement("Floor/data/Nbstudent").Value) descending
select new
{
    Name = r.Attribute("id").Value + "   ",
    Room = r.XPathSelectElement("Floor/data/Room").Value + "   ",
    NB = r.XPathSelectElement("Floor/data/Nbstudent").Value + "    ",
})
.Take(5);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM