Сбой XPathExpression AddSort - PullRequest
       0

Сбой XPathExpression AddSort

1 голос
/ 21 октября 2011

Я пытаюсь отсортировать результат из запроса xpath, но он не выполняется.

Ooutput:

ABC
DEF

Но я ожидаю:

DEF
ABC

Исходный код выглядит следующим образом, он использует выражение XML и сортирует результат:

var doc = new XPathDocument("testmsg2.xml");
var nav = doc.CreateNavigator();

const string query = "//Z/X/Code";

var expr = nav.Compile(query);
expr.AddSort("Code",
             XmlSortOrder.Descending,
             XmlCaseOrder.None,
             "",
             XmlDataType.Text);

switch (expr.ReturnType)
{                
    case XPathResultType.NodeSet:
        var nodes = (XPathNodeIterator)nav.Evaluate(expr);

        while (nodes != null && nodes.MoveNext())
        {
            if (nodes.Current == null)
                continue;

            if (nodes.Current.HasChildren)
            {
                var childIter = nodes.Current.SelectChildren(XPathNodeType.All);

                while (childIter.MoveNext())
                {
                    if (childIter.Current != null)
                        Console.WriteLine(childIter.Current.Value);
                }
            }
            else
            {
                Console.WriteLine(nodes.Current.Value);
            }
        }

        break;
}

Файл XML упрощен для этого примера:

<?xml version="1.0" encoding="utf-8"?>
<Z>
  <X>
    <Code>ABC</Code>
  </X>
  <X>
    <Code>DEF</Code>
  </X>
</Z>

Ответы [ 4 ]

2 голосов
/ 21 октября 2011

Хорошо, ваш путь //Z/X/Code выбирает Code элементов, сортировка затем должна использовать правильное относительное выражение, в вашем случае

expr.AddSort(".",
             XmlSortOrder.Descending,
             XmlCaseOrder.None,
             "",
             XmlDataType.Text);
2 голосов
/ 21 октября 2011

Метод AddSort принимает выражение XPath, которое контекстуально связано с XPathExpression, который вы скомпилировали. В вашем случае XPathExpression компилируется с элементом <Code>. Выполнение AddSort("Code") подразумевает, что у вас есть следующий XML:

<Code>
    <Code>
    </Code>
</Code>

Вместо этого вы можете скомпилировать выражение в X:

const string query = "//Z/X";

Или вы можете отсортировать по текущему узлу (будучи Code), .:

expr.AddSort(".", XmlSortOrder.Descending, XmlCaseOrder.None, "", XmlDataType.Text);
1 голос
/ 21 октября 2011

Либо удалите "/ Код" из вашего запроса "."вместо «Код» в AddSort () - в зависимости от того, хотите ли вы выбрать X-узлы или Code-узлы.В настоящее время вы запрашиваете узлы кода, а затем пытаетесь отсортировать их по тому, что возвращает «результат» кода XPath.Но нет ничего, что соответствует «Коду» относительно Код-узла.

0 голосов
/ 21 октября 2011

Некоторые альтернативы с использованием Linq to Xml

using System.Xml.XPath;

var document = XDocument.Parse(@"<Z>
                                  <X>
                                    <Code>ABC</Code>
                                  </X>
                                  <X>
                                    <Code>DEF</Code>
                                  </X>
                                 </Z>");

var codeValues = document.XPathSelectElements("//Z/X/Code")
                          .Select(e => e.Value)
                          .OrderByDescending(e => e);

Вы можете упростить его еще больше, если хотите. Вы должны принять во внимание производительность, хотя. Думаю, если ваши xml-файлы большие, это не сработает. Если у вас есть только небольшие файлы, простота этого перевешивает небольшое снижение производительности.

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