Php 如何在XPath中使用AND运算符?

Php 如何在XPath中使用AND运算符?,php,xml,xpath,Php,Xml,Xpath,XML就像 <a id="1"> <b>value1</b> <b>value2</b> </a> 节点中存在value1和value2,但我无法获得第一次使用XPath时的准确信息。以下XPath //a[b = 'value1' and b = 'value2']/@id 将根据请求选择所有a元素的id属性,其中子b元素的字符串值等于value1和另一个子b元素的字符串值等于value2。函数可以执行

XML就像

 <a id="1">
   <b>value1</b>
   <b>value2</b>
 </a>
节点中存在
value1
value2
,但我无法获得第一次使用XPath时的准确信息。

以下XPath

//a[b = 'value1' and b = 'value2']/@id
将根据请求选择所有
a
元素的
id
属性,其中子
b
元素的字符串值等于
value1
和另一个子
b
元素的字符串值等于
value2

函数可以执行此操作

$nodes = $xpath->query("//b[contains(., 'value1')] | //b[contains(., 'value2')]");
然后,获取父id

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

一个演示(带有HTML)。

这是一个坏主意,按值查找元素,因为琐碎的元素查找得到值的元素…@kjhughes抱歉,但我确实不理解为什么按值搜索元素。通常情况下,按id或以上搜索元素将得到值元素,对不起我的英语。我认为阅读不能推翻我的评论。@Naumov:你是对的,基于
@id
的搜索可能更可取,在这种情况下,这看起来是可能的,但让我们给OP一个好处,怀疑他的真实案例更复杂,这只是一个简化的案例。根据元素的值搜索元素本质上并不是一个“坏主意”。谢谢。@kjhughes对不起,我的英语不好,因为,把俄语翻译成英语,把英语翻译成俄语,可能会出错。再次表示歉意,并致以最良好的祝愿。啊-这就是我努力奋斗的地方。。。XPath查询中
@id
的位置。比我的答案(我现在将其删除)要简洁得多非常感谢。它工作得很好。但是当有更多的元素时,它就不能像预期的那样工作。标签中还有其他元素,如“欢迎光临”。您可以为
c
添加
和c='value3'
,也可以为
a
的任何子元素添加
和*='value3'
。如果这不符合您的需要,请提出一个新问题,确保举例说明哪些应该匹配,哪些不应该匹配。谢谢。这个答案是错的。它不捕获请求的AND概念,并且在应该使用字符串相等性测试的地方使用字符串包含测试。使用contains()而不是“=”是未阅读规范的人经常犯的错误。
$parent_id = $nodes->item(0)->parentNode->getAttribute("id");