Как вы определяете порядок следования узлов? - PullRequest
7 голосов
/ 11 января 2010

У меня есть следующий 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 (а), появляющихся в порядке, или (б) начиная с 1. Более того, последний, но я хочу, чтобы эта обработка была настолько же безопасной, как и возможно.

Что мне нужно сделать, это получить список телефонных номеров, отсортированных по значению Key (по возрастанию). Поэтому, используя XmlNode.SelectNodes, я бы хотел, чтобы результирующий XmlNodeList содержал узлы PhoneNumber в правильном порядке, не обязательно в том порядке, в котором они появляются.

Как это можно сделать с помощью XPath?
Возможно ли это сделать напрямую?

Если это имеет значение, я использую .NET 2.0.

Ответы [ 4 ]

4 голосов
/ 11 января 2010

Сам Xpath ничего для этого не определяет.

Для C # .NET это может быть то, что вы ищете: http://social.msdn.microsoft.com/forums/en-US/xmlandnetfx/thread/ba975e0e-e0c7-4868-9acc-11d589cafc70/

4 голосов
/ 11 января 2010

Класс XPathExpression предоставляет метод AddSort:

http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathexpression.aspx

3 голосов
/ 11 января 2010

Вот пример того, как сделать это с XPathExpression, используя уже упомянутый метод AddSort. 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++;
    }
}
3 голосов
/ 11 января 2010

Этого нельзя достичь с помощью XPath. Если бы вы использовали XPathDocument, вы могли бы использовать метод AddSort.

Однако, если вы уже используете XmlDocument (и / или вам нужно иметь возможность обновлять XML DOM), его, вероятно, просто скопировать результат SelectNodes в SortedDictionary, используя значение атрибута Key в качестве ключа. значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...