如何指定节点结果顺序?

时间:2010-01-11 15:13:57

标签: c# sorting xpath

我有以下XML,它是由第三方库生成的:

<PhoneNumbers>
    <PhoneNumber Key="1">123-456-7890</PhoneNumber>
    <PhoneNumber Key="2">234-567-8901</PhoneNumber>
    <PhoneNumber Key="3">345-678-9012</PhoneNumber>
</PhoneNumbers>

问题在于我不应该依赖于按顺序出现的Key属性(a)的值,或者(b)从1开始。更多是后者,但我希望此处理为尽可能安全。

我需要做的是获取电话号码列表,按Key值(升序)排序。因此,使用XmlNode.SelectNodes我希望生成的XmlNodeList按正确顺序包含PhoneNumber个节点,而不一定按照它们出现的顺序。

如何使用XPath完成此任务?
这可以直接做到吗?

如果它有所作为,我正在使用.NET 2.0。

4 个答案:

答案 0 :(得分:4)

答案 1 :(得分:4)

Xpath本身没有为此定义任何内容。

对于C#.NET,这可能是您正在寻找的: http://social.msdn.microsoft.com/forums/en-US/xmlandnetfx/thread/ba975e0e-e0c7-4868-9acc-11d589cafc70/

答案 2 :(得分:3)

使用XPath无法实现。如果您使用的是XPathDocument,则可以使用AddSort方法。

但是,如果您已经在使用XmlDocument(和/或需要能够更新XML DOM),那么可能只需使用Key属性的值将SelectNodes的结果转储到SortedDictionary中即可。关键值。

答案 3 :(得分:3)

以下是使用已提到的AddSort方法使用XPathExpression进行操作的示例。 XPathExpression可与.Net 2.0(http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathexpression.aspx

一起使用
private static void XmlTest()
{
    XPathDocument results = new XPathDocument(@"c:\temp\temp.xml");
    XPathNavigator navigator = results.CreateNavigator();
    XPathExpression selectExpression = navigator.Compile("/PhoneNumbers/PhoneNumber");
    XPathExpression sortExpr = navigator.Compile("@Key");
    selectExpression.AddSort(sortExpr, XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Text);
    XPathNodeIterator nodeIterator = navigator.Select(selectExpression);
    int i = 0;
    while (nodeIterator.MoveNext())
    {
        Console.WriteLine(nodeIterator.Current.Value);
        i++;
    }
}