不同节点的 XPath OR 运算符
Posted
技术标签:
【中文标题】不同节点的 XPath OR 运算符【英文标题】:XPath OR operator for different nodes 【发布时间】:2011-07-18 01:33:24 【问题描述】:如何使用 XPath:
//bookstore/book/title or //bookstore/city/zipcode/title
只有//title
不行,因为我也有//bookstore/magazine/title
附言我看到了很多例子,但主要是属性或单节点结构。
【问题讨论】:
OR 包含双方。您正在寻找的是 XOR 运算符。您将 OR 一词的英语用法与逻辑运算符混为一谈。 在这种情况下,使用 or 或 xor 没有区别,因为不可能同时匹配两边。 【参考方案1】:以zipcode
或book
节点为父节点的所有title
节点:
版本 1:
//title[parent::zipcode|parent::book]
版本 2:
//bookstore/book/title|//bookstore/city/zipcode/title
第 3 版:(结果根据源数据排序,而不是按书籍顺序和邮政编码排序)
//title[../../../*[book or magazine] or ../../../../*[city/zipcode]]
or - 在 true/false 中使用 - xpath 中的布尔运算符
| - xpath 中的联合运算符将运算符右侧的查询附加到左侧查询的结果集。
【讨论】:
"|"在 XPath 中并不是真正的“OR 运算符”。它允许您构建由整个 XML 树的子树组成的节点集。 “//book|//cd”表示在所有子节点和根节点的后代中找到所有名为“book”的节点,然后也找到所有名为“cd”的节点。如果在根节点的后代中只有书节点,则您的节点集将仅包含书节点。如果在根节点的后代中只有 cd 节点,则您的节点集将仅包含 cd 节点。如果在根节点的后代中同时存在 book 和 cd 节点,则您的节点集将同时包含 book 和 cd 节点。 是的,我明白什么是“|”运营商是。我最初的问题是关于 OR 运算符。因此,如果有书籍和 cd,它只会找到书籍,如果没有书籍,但只有 cd,它会找到 cd。 @user569008:|
是union set operator。
那么,我的问题没有答案/节点的 XPath 中没有 OR 运算符?
逻辑运算符(OR、XOR、AND)在每种编程语言中都是相同的,但自然语言对它们的解释略有不同。在讨论与其相关的问题时,最好消除歧义。此外,对于 XPath,最好不要将您的结果视为是 a 或 b,而是可以由 a 或 b。逻辑or
表示它可以通过a or b or both
定位。 Logical xor
(eXclusive OR) 表示它可以通过either a or b, but not both
定位。逻辑and
表示它可以通过both a and b
定位。【参考方案2】:
如果您只想选择具有联合运算符的两个节点之一,您可以使用此解决方案:
(//bookstore/book/title | //bookstore/city/zipcode/title)[1]
【讨论】:
真的(
和)[1]
意味着只选择两者之一?!?!
@Anthony 是的,如果两个节点都存在,它将选择两者之一,否则它将选择唯一存在的一个。
好吧,我误解了你的说法。它像任何其他“或”运算符一样操作,因此如果第一个条件返回 true,则第二个条件被绕过,是吗?
@Anthony 没有。这里没有条件。有节点。和“|” - 是节点联合运算符。它从指定路径创建节点集,并且不保证节点顺序。如果具有指定路径的节点不存在,则它只是在节点集中丢失。然后,“[1]”构造从节点集中获取第一个节点。
@Anthony 整个构造“(path1 | path2)[1]”在某些编程语言中就像一个 or 运算符 - 它会返回第一个找到的节点(不一定是来自 path1 的节点)。
【参考方案3】:
它的元素有两个xpath。然后你可以像下面这样写两个xpath:
xpath1
| xpath2
例如:
//input[@name="username"] | //input[@id="wm_login-username"]
【讨论】:
以上是关于不同节点的 XPath OR 运算符的主要内容,如果未能解决你的问题,请参考以下文章