【问题标题】:How to use AND operator in XPath?如何在 XPath 中使用 AND 运算符?
【发布时间】:2016-11-07 12:41:19
【问题描述】:

XML 就像

 <a id="1">
   <b>value1</b>
   <b>value2</b>
 </a>

我想编写 XPath 来查找 &lt;a&gt; 的 id,其中将有两个 &lt;b&gt; 子节点具有固定值 value1value2。我试图找出具有类似条件的 XPath

$xml->xpath('*[b=value1] | *[b=value2]');  

value1value2 存在于 &lt;b&gt; 节点中,但我无法完全按照我第一次使用 XPath 的方式获得。

【问题讨论】:

  • 按值查找元素是个坏主意,因为微不足道的元素会找到获取值的元素...
  • @kjhughes 抱歉,但我真的不明白为什么按值搜索元素。通常,按 id 或以上的元素搜索将得到 value 元素,对不起我的英语。我认为阅读无法理解我的评论。
  • @Naumov:你说得对,基于@id 的搜索可能更可取,在这种情况下它看起来是可能的,但让我们怀疑他的真实情况更复杂,这只是一个简化的案例。根据元素的值搜索元素本质上并不是一个“坏主意”。谢谢。
  • @kjhughes 对不起,我的英语很糟糕,因为将俄语翻译成英语,将英语翻译成俄语,可能会出错。再次抱歉,向您致以最诚挚的问候。

标签: php xml xpath


【解决方案1】:

contains函数可以做到。

$nodes = $xpath->query("//b[contains(., 'value1')] | //b[contains(., 'value2')]");

然后,获取父ID

$parent_id = $nodes->item(0)->parentNode->getAttribute("id");

一个演示(带有 HTML)here.

【讨论】:

  • 这个答案是错误的。它不捕获请求的 AND 概念,并且在应该使用字符串相等测试的地方使用字符串包含测试。
  • 使用 contains() 代替 "=" 是未阅读规范的人常犯的错误。
【解决方案2】:

以下 XPath,

//a[b = 'value1' and b = 'value2']/@id

将选择所有a 元素的id 属性,其中一个子b 元素的字符串值等于value1 AND 另一个子b 元素的字符串值等于@ 987654327@ 按要求发送。

【讨论】:

  • Aaah - 这就是我苦苦挣扎的地方...... XPath 查询中@id 的位置。比我的答案更整洁(我现在将删除);)
  • 谢谢。它工作正常。但是当有更多元素时,它就无法按预期工作。例如。 标签中还有其他元素,例如
  • 不客气。您可以为c 添加and c = 'value3',也可以为a 的任何子元素添加and * = 'value3'。如果这不能满足您的需求,请提出一个新问题,并确保展示应该匹配和不应该匹配的示例。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多