【问题标题】:System.Xml.XPath.XPathException: Expression must evaluate to a node-set when executing SelectSingleNode("//(artist|author)")System.Xml.XPath.XPathException:执行 SelectSingleNode("//(artist|author)") 时,表达式必须计算为节点集
【发布时间】:2009-03-10 16:42:22
【问题描述】:

有人能解释一下为什么这不起作用吗?

我正在执行

XmlNode xmlNode = xmlDocument.SelectSingleNode("//(artist|author)");

我明白了

System.Xml.XPath.XPathException:表达式必须计算为节点集。

但这有效,即使有很多艺术家节点也不会引发异常

XmlNode xmlNode = xmlDocument.SelectSingleNode("//artist");

【问题讨论】:

  • 也许 //(艺术家|作者) 评估为 0 个节点?
  • 不,我在其他 xpath 评估器上测试了它:S
  • “//艺术家|//作者”会发生什么?
  • 尝试检查调试器(使用 xmlDoc.SelectNodes),因为在某些极端情况下,不同的库可能会有不同的行为

标签: c# xml xpath selectsinglenode


【解决方案1】:

据我所知,您可以使用“|”就在 XPath 查询的顶层,所以试试这个查询

    "//artist|//author"

顺便说一句,递归搜索 (//) 不是很快,所以请确保您的 dom 文档很小。

更新:

我在specification中查到了:

3.3 节点集

位置路径可以用作 表达。表达式返回 路径选择的节点集。

该 |运算符计算并集 它的操作数,必须是节点集。

这意味着你在“|”的左边和右边写什么需要单独用作 xpath 查询,“|”然后从它创建联合。

具体而言,您不能说“递归搜索(称为作者或称为艺术家的事物)”,因为“称为作者的事物”不会评估为 xpath 查询(节点集)的结果。

【讨论】:

    【解决方案2】:
    1. //artist|//author 适用于 XPATH 1.0 和 2.0
    2. //(artist|author) 适用于 XPATH 2.0

    微软是一家懒惰的公司。他们的框架仅支持 XPATH 1.0

    【讨论】:

    • 没有 XPath 2.0,因为它们“懒惰”——当然。
    猜你喜欢
    • 2020-04-29
    • 1970-01-01
    • 2020-07-13
    • 2013-07-24
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多