ошибка подсчета выражений xpath () с исключением, выражение должно вычисляться с набором узлов

#c# #.net #xml #xpath

#c# #.net #xml #xpath

Вопрос:

Я получаю исключение: System.Xml.XPath.XPathException: выражение должно вычисляться с набором узлов.

когда я запускаю этот код, который я ожидаю подсчитать количество узлов, что я делаю не так?

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

var expr = nav.Compile("count(//bookstore/book)");

var iterator = nav.Select(expr);
while (iterator.MoveNext())
{
    if (iterator.Current != null amp;amp; !iterator.Current.HasChildren) continue;
    if (iterator.Current != null)
    {
        var childIter = iterator.Current.SelectChildren(XPathNodeType.Element);
        while (childIter.MoveNext())
        {
            if (childIter.Current != null) Console.WriteLine(childIter.Current.Value);
        }
    }
}
  

мой XML-файл выглядит следующим образом

 <?xml version="1.0" encoding="utf-8" ?>
<bookstore>
  <book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
    <title>The Autobiography of Benjamin Franklin</title>
    <author>
      <first-name>Benjamin</first-name>
      <last-name>Franklin</last-name>
    </author>
    <price>8.99</price>
  </book>
  <book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
    <title>The Confidence Man</title>
    <author>
      <first-name>Herman</first-name>
      <last-name>Melville</last-name>
    </author>
    <price>11.99</price>
  </book>
  <book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
    <title>The Gorgias</title>
    <author>
      <name>Plato</name>
    </author>
    <price>9.99</price>
  </book>
</bookstore>
  

Примечание: Спасибо за усилия, чтобы помочь мне. Я придумал это решение:

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

const string query = "count(//bookstore/book)";            
var expr = nav.Compile(query);

switch (expr.ReturnType)
{        
    case XPathResultType.Number:
        Console.WriteLine(nav.Evaluate(query));
        break;

    case XPathResultType.String:
    // case XPathResultType.Navigator:
        Console.WriteLine(nav.Evaluate(query));
        break;

    case XPathResultType.Boolean:
        Console.WriteLine(nav.Evaluate(query));
        break;

    case XPathResultType.NodeSet:
        var nodes = nav.Select(expr);
        while (nodes.MoveNext())
        {                      
            if (nodes.Current != null amp;amp; !nodes.Current.HasChildren) continue;
            if (nodes.Current == null) continue;
            var childIter = nodes.Current.SelectChildren(XPathNodeType.Element);
            while (childIter.MoveNext())
            {
                if (childIter.Current != null) Console.WriteLine(childIter.Current.Value);
            }
        }
        break;

    case XPathResultType.Any:
        Console.WriteLine(nav.Evaluate(query));
        break;              

    default:
        Console.WriteLine(nav.Evaluate(query));                    
        break;
}            
  

Ответ №1:

Используйте Evaluate, а не Select:

двойное количество = (двойное)nav.Evaluate(выражение);

Комментарии:

1. 1 за интересную деталь, которая возвращает двойное значение — несколько неожиданно.

Ответ №2:

В этой строке:

 var iterator = nav.Select(expr); 
  

выражение expr должно быть выражением XPath, возвращающим набор узлов. Ваше выражение XPath — это выражение, которое возвращает скалярное значение, количество книжных узлов.

Комментарии:

1. Что мне нужно использовать вместо этого?

2. @user800454: вместо этого вам нужно читать и практиковаться. Вы не должны ожидать, что ответ полностью выполнит вашу домашнюю работу. Никакой ответ не может заполнить огромные пробелы в знаниях и опыте, которые можете заполнить только вы. Читать, читать, читать, …

Ответ №3:

Просто измените на:

 var expr = nav.Compile("//bookstore/book");
  

Ответ №4:

 var expr = nav.Compile("count(//bookstore/book)");
Console.WriteLine(nav.Evaluate(expr));