Как Вы указываете порядок результата узла?

У меня есть следующий 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.

7
задан double-beep 1 February 2019 в 19:24
поделиться

4 ответа

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

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

4
ответ дан 6 December 2019 в 15:22
поделиться

Вот пример того, как это сделать с помощью 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
ответ дан 6 December 2019 в 15:22
поделиться

Класс XPathexpression обеспечивает метод Addsort:

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

4
ответ дан 6 December 2019 в 15:22
поделиться
if (thereIsSomeThingToDoInTheElse)
{
    putAnElseClause();
}
else
{
    // intentionally left blank
}
-121--947191-

, чтобы расширить (полностью правильный) ответ J.J., библиотека protobuf не имеет пути выяснить, как долго сообщения сами по себе, или выяснить, какой тип объекта protobuf отправляется *. Так что другое приложение, которое отправляет вам данные, должно уже делать что-то подобное.

Когда мне пришлось это сделать, я реализовал таблицу поиска:

messageLookup={0:foobar_pb2.MessageFoo,1:foobar_pb2.MessageBar,2:foobar_pb2.MessageBaz}

... и сделал по существу то, что сделал Джей Джей, но у меня также была вспомогательная функция:

    def parseMessage(self,msgType,stringMessage):
        msgClass=messageLookup[msgType]
        message=msgClass()
        message.ParseFromString(stringMessage)
        return message

... которую я вызвал, чтобы превратить последовательность в объект протобуфа.

(*) Я думаю, что можно обойти это, инкапсулируя конкретные сообщения в сообщение контейнера

-121--2309893-

Это невозможно выполнить с помощью XPath. При использовании XPathDocument можно использовать метод AddSort .

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

3
ответ дан 6 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: