c# - xpath 表达式 count() 失败并出现异常,表达式必须评估为节点集

标签 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 && !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 && !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;
}            

最佳答案

使用Evaluate ,而不是选择:

双计数 = (double)nav.Evaluate(expr);

关于c# - xpath 表达式 count() 失败并出现异常,表达式必须评估为节点集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7808558/

相关文章:

c# - C# 中的空 "if"语句是否会导致错误或警告?

java - 尝试更改字体时出现 Digitalclock 运行时错误

java - 序列化时处理无效的 xml 字符

c# - .Net Core开放外部终端

c# - 线程与任务中的 ThreadStatic 属性

.net - 如何重用从 .NET 客户端到 Apache 服务器的 SSL 连接

.net - Selenium 或 Coypu 等待元素显示并在显示前获取时间

xml - 将 XML 命名空间属性添加到第 3 方 xml?

c# - 删除文本文件的第一行而不读取它

c# - WCF RESTful 服务不接受 JSON 输入