You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java XPath获取XML标签内容时捕获冗余数据问题求助

如何用XPath获取元素的直接文本(排除子元素文本)

问题场景

你的Java代码通过XPath选中目标div后,获取到的文本包含了子span标签内的内容("1Commentaire de la signature"),而直接在XPath末尾添加/text()却返回空值。

原因分析

  1. 当XPath选中元素节点并以XPathConstants.STRING类型获取结果时,会自动拼接该元素所有后代文本节点的内容,因此span里的"1"和div的直接文本会被合并返回。
  2. 直接添加/text()时,div的直接子节点包含多个文本节点(包括span前后的换行、缩进空白),默认情况下可能仅返回第一个空白文本节点,导致结果为空。

解决方案

修改XPath表达式,精准选中div下的有效直接文本节点,过滤掉空白内容:

方案1:过滤非空白的直接文本节点

调整XPath,通过normalize-space()筛选出非空白的文本节点:

// 拼接目标XPath
String xpathExpr = "//div[@class=\"history-entries\"]/div[" + (index_historyEntrie+1) + "]/div[@class=\"history-values\"]/div[" + (index_historyValue+1) + "]/text()[normalize-space()]";
expr_divValues = xpathDiv.compile(xpathExpr);
// 获取结果并去除多余空白
result_divValues = expr_divValues.evaluate(doxDiv, XPathConstants.STRING).trim();

方案2:选中最后一个直接文本节点

根据你的XML结构,有效文本位于span标签之后,是div的最后一个直接文本节点,可直接选中该节点:

String xpathExpr = "//div[@class=\"history-entries\"]/div[" + (index_historyEntrie+1) + "]/div[@class=\"history-values\"]/div[" + (index_historyValue+1) + "]/text()[last()]";
expr_divValues = xpathDiv.compile(xpathExpr);
result_divValues = expr_divValues.evaluate(doxDiv, XPathConstants.STRING).trim();

验证说明

两种方案都会仅获取div下span之后的"Commentaire de la signature"文本,排除子span内的"1",同时去除文本前后的空白字符。


内容的提问来源于stack exchange,提问作者Xavier Domdom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 08:10:39