Php xpath以排除具有类的元素

Php xpath以排除具有类的元素,php,dom,xpath,domdocument,Php,Dom,Xpath,Domdocument,我正在尝试选择所有具有id=“mydiv”的dom元素,但排除也具有class=“exportss”的dom元素。现在我正在做第一部分/*[@id=“mydiv”]。如何添加类排除部分 另外,如果你想知道为什么我需要选择多个具有相同id的元素,我只是在处理一个我无法控制的现有DOM 您可以使用否定: //*[@id="mydiv" and @class!="exclass"] 如果并非所有节点上都存在class属性,则需要: //*[@id="

我正在尝试选择所有具有
id=“mydiv”
的dom元素,但排除也具有
class=“exportss”
的dom元素。现在我正在做第一部分
/*[@id=“mydiv”]
。如何添加类排除部分

另外,如果你想知道为什么我需要选择多个具有相同id的元素,我只是在处理一个我无法控制的现有DOM

您可以使用否定:

//*[@id="mydiv" and @class!="exclass"]
如果并非所有节点上都存在
class
属性,则需要:

//*[@id="mydiv" and (not(@class) or @class!="exclass")]
最后一个(有些)奇怪的逻辑可以转化为Michael提出的:

//*[@id="mydiv" and not(@class="exclass")]

不过,就个人而言,如果缺少属性,XPath就无法进行比较,这一事实感觉有点像是一个缺点。

对这个问题的回答是这样的

//*[@id="mydiv" and not(@class="exclass")]
如果存在@id属性且其值为mydiv,则条件的前半部分为true。如果没有@class属性的值为exportss,则后半部分为true:即,如果没有class属性,或者如果有class属性且其值不是“exportss”,则后半部分为true


避免使用!=在这种情况下:90%的时候,如果你想写
A=B
,您可能希望
而不是(A=B)
。如果A或B不是单例,也就是说,它要么是空的,要么可以包含多个值,那么意义就不同了。

这不是用户所要求的。否决票。看看我的答案。@MichaelKay谢谢你指出这一点,我已经更新了我的答案;正如我在更新中提到的,我觉得“没有什么比不上任何东西”是xpath的一个缺点;只是想不出为什么这种行为会有用:/你有多个元素具有相同的id?你知道,那不健康。