2014-03-12 107 views
3

我有以下结构的XML文件:如何找到XML文件中属性值的最大值?

<doc> 
    <rootelement> 
    <childelement id="0" /> 
    <childelement id="1" /> 
    . 
    . 
    </rootelement> 
</doc> 

我想找到id属性

的想法,我心目中的最高数值是一样的东西:

int highest = -1; 
foreach(var node in xmldoc.SelectNodes("//doc/rootelement/childelement")) 
{ 
    highest = Math.Max(GetID(node), highest); 
} 

其中GetID(XMLNode)将检索当前节点的属性的值。

是否有一个更紧凑(或更高效)的XPath表达式来做到这一点?

回答

3

您可以使用LINQ到XML:

var xdoc = XDocument.Load(path_to_xml); 
var maxId = xdoc.XPathSelectElements("//doc/rootelement/childelement") 
       .Max(c => (int)c.Attribute("id")); 

或者没有的XPath:

var maxId = xdoc.Root.Elements("rootelement") 
       .Elements("childelement") 
       .Max(c => (int)c.Attribute("id")); 

随着XmlDocument的:

var maxId = doc.SelectNodes("//doc/rootelement/childelement") 
       .Cast<XmlElement>() 
       .Max(c => Int32.Parse(c.Attributes["id"].Value)); 
+0

是否有一种变体也可以用XmlDocument而不是XDocument来完成此操作?我已经创建了一个XmlDocument,并将当前代码中的所有内容(从XmlDocument到XDocument)转换(为了一致性),需要进行一些重构。 – Pep

+0

@Pep sure sure you can(I'll update answer in a minute)but Linq to Xml is a preferred way to work with xml –

+0

很好,谢谢。我现在正在阅读http://stackoverflow.com/questions/1542073/xdocument-or-xmldocument,而且由于我们正在编写一个.NET 4.0插件,我没有看到任何将来重构使用XDocument的缺点。 – Pep

1

使用LINQ到XML。

string xml = 
    @"<doc> 
    <rootelement> 
     <childelement id='0' /> 
     <childelement id='1' /> 
    </rootelement> 
    </doc>"; 

var doc = XDocument.Parse(xml); 
int max = doc.Descendants("childelement").Max(e => (int)e.Attribute("id"));