代码之家  ›  专栏  ›  技术社区  ›  Jon Seigel

如何指定节点结果顺序?

  •  7
  • Jon Seigel  · 技术社区  · 16 年前

    我有以下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开始。更重要的是后者,但我希望这个处理过程尽可能安全。

    我需要做的是得到一个电话号码列表,按 钥匙 值(升序)。所以通过使用 XmlNode.SelectNodes 我想要结果 XmlNodeList 遏制 PhoneNumber 节点按正确的顺序排列,不一定按它们出现的顺序排列。

    如何使用xpath来实现这一点?
    这可以直接做吗?

    如果有什么不同,我使用的是.NET 2.0。

    4 回复  |  直到 7 年前
        1
  •  4
  •   Roland Bouman    16 年前

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

    对于c.net,这可能是您想要的: http://social.msdn.microsoft.com/forums/en-US/xmlandnetfx/thread/ba975e0e-e0c7-4868-9acc-11d589cafc70/

        2
  •  4
  •   hackerhasid    16 年前
        3
  •  3
  •   AnthonyWJones    16 年前

    这不能用xpath完成。如果你用的是 XPathDocument 你可以用 AddSort 方法。

    但是,如果您已经在使用xmldocument(和/或需要能够更新xmldocument),那么将selectnodes的结果转储到 SortedDictionary 使用键属性的值作为键值。

        4
  •  3
  •   dcp    16 年前

    下面是一个如何使用前面提到的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++;
        }
    }