如何通过Java XPath表达式获取指定节点的前一个兄弟节点?
解决XPath获取前一个兄弟节点的问题
先搞定你的具体例子
当然可以!你给出的目标节点XPath是 /parties/party(1)/typeDesc,它的前一个兄弟节点对应的XPath就是 /parties/party(1)/typeCode —— 因为这两个节点共享同一个父节点 /parties/party(1),且typeCode在XML结构上紧邻typeDesc之前。
通用方法:获取任意XPath节点的前一个兄弟节点
不管输入的XPath是什么形式(带谓词、位置索引、复杂轴等),都有两种可靠的通用方案:
方案1:用XPath轴实现(最通用,无需提前知道兄弟节点名)
直接在原XPath的末尾追加 /preceding-sibling::*[1],就能精准定位到紧挨着目标节点的前一个兄弟节点。
- 示例:原XPath是
/parties/party[@id='abc']/typeDesc,则前一个兄弟的XPath为/parties/party[@id='abc']/typeDesc/preceding-sibling::*[1] - 原理:
preceding-sibling::轴会选取当前节点之前的所有兄弟节点,[1]限定只取最靠近目标节点的那一个(XPath轴默认按反向文档顺序遍历,所以[1]就是紧邻的前一个)
方案2:手动替换父节点下的节点名(适合已知兄弟节点名的场景)
如果你已经知道前一个兄弟节点的名称,可以直接修改原XPath的最后一段:
- 保留原XPath中除最后一个节点外的所有内容(也就是父节点的XPath)
- 将最后一段替换为前一个兄弟节点的名称
- 示例:原XPath
/parties/party(1)/typeDesc,父节点是/parties/party(1),替换最后一段为typeCode,得到/parties/party(1)/typeCode
注意事项
- 如果目标节点是父节点的第一个子节点,
preceding-sibling::*[1]会返回空结果(因为没有前一个兄弟) - 若原XPath使用了
//等相对路径,上述方法依然有效,比如//typeDesc/preceding-sibling::*[1]会选取所有typeDesc节点的前一个兄弟
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

