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 值,但名称总是 return 相同(即使之后的数据不属于此属性。
我不知道如何获得正确的属性。
试试这个:
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);
通过对原始代码进行最少更改来解决问题的另一种可能选择:
Name = r.XPathSelectElement("ancestor::Professor[1]").Attribute("id").Value + " ",
我需要从 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 值,但名称总是 return 相同(即使之后的数据不属于此属性。
我不知道如何获得正确的属性。
试试这个:
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);
通过对原始代码进行最少更改来解决问题的另一种可能选择:
Name = r.XPathSelectElement("ancestor::Professor[1]").Attribute("id").Value + " ",