计算具有属性值的节点

时间:2015-11-22 22:19:47

标签: c# .net linq linq-to-xml

我正在尝试从XmlDocument切换到Linq,并且正在努力获得我想要的东西。

我有类似的XML,

<root>
<Surfer Status='5'>
    <Name>Billy</Name>
    <County>Cornwall</County>
</Surfer>
<Surfer Status='5'>
    <Name>Tim</Name>
    <County>Cornwall</County>
</Surfer>
<Surfer Status='10'>
    <Name>Ryan</Name>
    <County>Devon</County>
</Surfer>
</root>

我可以算上这样的所有冲浪者。

XDocument X = XDocument.Load("Surfers.xml");
int Total = X.Descendants("Surfer").Count();

我希望像这样计算所有状态为5的冲浪者

int fives = X.Descendants["Surfer[@Status='5']").Count();

但它不起作用!

2 个答案:

答案 0 :(得分:1)

使用Where

int fives = X.Descendants("Surfer").Where(s => (int)s.Attribute("Status") == 5).Count();

或者如果您真的想要使用XPath表达式,可以在添加using System.Xml.XPath并使用XPathSelectElements后执行此操作:

int fives = X.XPathSelectElements("Surfer[@Status='5']").Count();

答案 1 :(得分:1)

您可以使用带有谓词的Count重载

int fives = X.Descendants("Surfer").Count(x => x.Attribute("Status")?.Value == "5");

x.Attribute("Status")将从Status元素检索Surfer属性,?.运算符会阻止NullReferenceException如果任何Surfer元素没有Status angular.module('myApp', []).config(function($interpolateProvider){ $interpolateProvider.startSymbol('{*').endSymbol('*}'); }); 属性。