2011-12-12 40 views
4

有什么办法在XPath DOM编程中使用System.Xml来运行selectNodes(XPATH)的排序参数?用XPath排序 - 不是XSL

例如,使用以下XML和程序写入与文档相同顺序的值(降序)。有没有使用XPath按升序获取值的方法?

注意。当然,你可以预先在XSL中进行排序,但是我需要在循环遍历它们时更新这些值。由于XSL给我一个排序的副本的元素,不是实际的元素本身,我不能使用XSL。

这里的一些XML,程序out输出

public static void Main() { 

     XmlDocument xml = new XmlDocument(); 
     xml.Load("t.xml"); 

     // SelectNodes gets in document order, but I want in 
      // ascending order based on @value 
     foreach(XmlNode ndNode in xml.SelectNodes("/xml/ele")) { 
      Console.WriteLine(ndNode.Attributes["value"].Value); 
     } 
    } 

这里的最后文件输出(降序)的XML

<xml> 
<ele value='3' test='Third'/> 
<ele value='2' test='Second'/> 
<ele value='1' test='First'/> 
</xml> 

秩序。我想要一个XPath以升序返回节点。

3 
2 
1 

PS,我在Visual Studio .NET 2008 3.5

+0

从您的示例中,我看不出为什么XSL不适合您。原始元素究竟是什么,意味着你必须修改它们? –

+0

XPath 2.0具有“反向”功能。 –

+0

嗨保罗,澄清,我需要更新循环中的元素。由于我迭代每个元素包含一个有效和有效期限。我需要按生效日期排序的元素,并将到期日期设置为下一个生效日期。当然,我想可以通过输出文档的副本在XSL中完成,但我正在寻找更有效的方法。 –

回答

4

XPath不支持排序,但您可以查看AddSort方法。

+0

Wojteq,谢谢另一种解决方法。看起来比LINQ清洁一点。 –

3

使用System.Xml没有,有没有办法做的XPath单独排序。

但是,你可以很容易地使用LINQ来按照你想要的值对你的节点集合进行排序。

XmlDocument xml = new XmlDocument(); 
xml.LoadXml("<xml> <ele value='3' test='Third'/> <ele value='2' test='Second'/> <ele value='1' test='First'/> </xml>"); 
var nodes = xml.SelectNodes("/xml/ele").Cast<XmlNode>().OrderBy(ndNode => ndNode.Attributes["value"].Value); 
+0

有趣,但不是LINQ只是为了将SQL数据集转换为XML?我的XML不在数据库中。 –

+0

不可以。您谈论的是LINQ功能性子集的LINQ-to-SQL。我已经添加了示例如何获取您需要的节点集合,如果您想要使用XmlDocument。您可能还想考虑LINQ-to-XML(XDocument,...)。 –

+0

感谢Alexi,LINQ看起来像个赢家。我很感激你把它引起我的注意。 –