使用 XPath 匹配除一个之外的所有元素和文本

Posted

技术标签:

【中文标题】使用 XPath 匹配除一个之外的所有元素和文本【英文标题】:Matching all the elements and text excluding one by using XPath 【发布时间】:2020-11-21 11:13:04 【问题描述】:
<div class="main">
  <div class="column-items">
    <div>
      abcd
    </div>
    <h2>Thomas</h2>
    <p>Ron</p>
  </div>
  <p>Dave</p>
  Sample text here......
  <b>Andrew</b>
  El murciélago de Bacardí tiene su!!
  <p>abcdef</p>
</div>

在上述结构中,我希望 XPath 获取所有内容,包括 &lt;div class="main"&gt; 内的文本,除了我不想要第一个 div 元素的内容,即 &lt;div class="column-items"&gt;

【问题讨论】:

显示您已经尝试过的内容。还可以共享所需的确切输出 【参考方案1】:

如果您希望“主”div 中的所有文本节点不包括“列项”div 中的文本节点,请尝试:

//div[@class='main']//text()[not(ancestor::div[@class="column-items"])]

【讨论】:

【参考方案2】:

问题标题要求除一个之外的所有元素和文本,您接着说应该排除第一个元素。如果您实际上只想要满足该条件的文本节点,请参阅@JaSON's answer。

如果您确实也想要所有元素,请使用此 XPath:

//div[@class='main']/node()[not(self::div[1])]

基于位置或此 XPath,

//div[@class='main']/node()[not(self::div[@class="column-items"])]

基于属性值。

【讨论】:

嗨,肯尼斯。 XPath 表达式末尾的normalize-space() 谓词如何排除空白节点? //div[@class='main']/node()[not(self::div[1])][normalize-space()] 没有提到这样的要求,但也许它可能会有所帮助。

以上是关于使用 XPath 匹配除一个之外的所有元素和文本的主要内容,如果未能解决你的问题,请参考以下文章

XPath 获取除具有特定名称的子元素之外的所有子元素?

选择除兄弟姐妹和自我之外的所有元素

移除元素

正则表达式:匹配文本段落中除特定短语外的所有内容

jQuery 删除复制和替换元素

MySQL -- 标记除 1 个匹配行之外的所有行