5

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

我正在执行

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

我得到

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

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

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

2 回答 2

9

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

    "//artist|//author"

再见,递归搜索(//)不是很快,所以请确保您的 dom 文档很小。

更新:

我在规范中查找了它:

3.3 节点集

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

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

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

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

于 2009-03-10T17:21:26.550 回答
0
  1. //artist|//author适用于 XPATH 1.0 和 2.0
  2. //(artist|author)适用于 XPATH 2.0

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

于 2009-12-02T10:35:03.760 回答