Java XPath获取XML标签内容时捕获冗余数据问题求助
如何用XPath获取元素的直接文本(排除子元素文本)
问题场景
你的Java代码通过XPath选中目标div后,获取到的文本包含了子span标签内的内容("1Commentaire de la signature"),而直接在XPath末尾添加/text()却返回空值。
原因分析
- 当XPath选中元素节点并以
XPathConstants.STRING类型获取结果时,会自动拼接该元素所有后代文本节点的内容,因此span里的"1"和div的直接文本会被合并返回。 - 直接添加
/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
相关产品推荐
相关产品推荐

