Groovy递归启用XML节点问题求助(含报错与场景需求)
解决Groovy处理XML节点递归启用的异常与需求实现
我来帮你搞定这个问题!先拆解下你遇到的异常和核心需求:
异常原因分析
你碰到的No signature of method: groovy.util.NodeList.depthFirst()错误,本质是代码里的it.children返回的是NodeList类型,而这个类本身并没有depthFirst()方法——depthFirst()是Node类专属的遍历方法,不是NodeList的。另外你的原有代码还漏掉了向上递归启用所有父节点的关键逻辑,这也是需求明确要求的部分。
完整解决方案代码
下面是修正后的代码,完全实现你提出的两个场景需求:
def mdsFile = "你的XML文件路径" def testItemToEnable = "test1" // 可替换为testX测试场景2 // 解析XML,保留原格式设置 def root = new XmlParser(false, false, true).parse(mdsFile) // 1. 精准定位目标节点 def targetNode = root.depthFirst().find { it.@name == testItemToEnable } if (targetNode) { // 2. 启用目标节点及其所有子节点 targetNode.depthFirst().each { node -> node.@enabled = "true" } // 3. 向上递归启用所有父节点 def parent = targetNode.parent() while (parent != null && parent != root) { // 遍历到根节点为止,若需根节点启用可去掉&& parent != root parent.@enabled = "true" parent = parent.parent() } // 保存修改后的XML,保留原格式 def printer = new XmlNodePrinter(new PrintWriter(new File("修改后的XML路径"))) printer.preserveWhitespace = true printer.print(root) } else { println "未找到指定的testItem: ${testItemToEnable}" }
代码逻辑说明
- 定位目标节点:用
root.depthFirst().find()快速遍历整个XML树,精准找到你指定的testItem节点 - 启用自身及子节点:直接调用目标节点的
depthFirst(),一次性遍历它自身和所有层级的子节点,统一设置enabled="true" - 启用父节点:通过
parent()方法逐层向上遍历父节点,直到根节点(按需决定是否启用根节点) - 保存XML:用
XmlNodePrinter保存修改后的内容,同时保留原文件的格式结构
场景验证
场景1:指定'test1'
- 执行后,
test1节点的enabled设为true - 向上递归到
TestSuite1节点,其enabled也设为true test1的所有子节点(如果存在)也会被同步设为true
场景2:指定'testX'
- 执行后,
testX节点的enabled设为true - 向上递归到
test2、TestSuite1节点,它们的enabled都设为true testX的所有子节点(如果存在)也会被同步设为true
这样就完全满足你的需求,而且不会再出现之前的方法不存在的异常了。
内容的提问来源于stack exchange,提问作者George Cimpoies
相关产品推荐
相关产品推荐

