如何在XmlSlurper生成的GPathResult上使用XPath提取链接?
在GPathResult中实现目标XPath的查询方法
你可以通过GPath语法直接转换原XPath的逻辑,以下是具体实现方案:
核心查询代码
对应浏览器中的XPath //a[.//div[@class = 'sign-mail-btn-text']],GPath的写法如下:
方式一(兼容所有Groovy版本)
// 假设gPathResult是你已解析好的GPathResult对象 def targetLinks = gPathResult.depthFirst().a.findAll { aNode -> // 检查当前a节点下是否存在class为sign-mail-btn-text的div aNode.depthFirst().div.any { divNode -> divNode.@class == 'sign-mail-btn-text' } }
方式二(Groovy 2.5+ 简洁写法)
Groovy 2.5及以上版本支持**作为递归遍历所有子节点的语法(等价于XPath的//),可以简化代码:
def targetLinks = gPathResult.**/a.findAll { it.**/div.any { div -> div.@class == 'sign-mail-btn-text' } }
提取链接地址
如果需要获取a标签的href属性,直接遍历结果即可:
targetLinks.each { link -> println "签名链接: ${link.@href}" }
额外提示:HTML解析兼容性
由于邮件HTML通常不是严格的XML格式,解析时建议关闭DTD校验和命名空间支持,避免解析报错:
def slurper = new XmlSlurper() // 关闭外部DTD加载 slurper.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false) // 关闭命名空间支持 slurper.setFeature("http://xml.org/sax/features/namespaces", false) def gPathResult = slurper.parseText(this.GetNewMessage(folderName))
内容的提问来源于stack exchange,提问作者Mike Warren
相关产品推荐
相关产品推荐

