如何使用Groovy获取XML节点的属性值?
使用Groovy提取带命名空间的XML节点属性值
没问题,我来帮你搞定这个Groovy处理XML的事儿。你的XML里带有命名空间(比如test和xmi),这是处理时需要注意的关键点,Groovy的XmlSlurper是处理这类需求的绝佳工具,下面给你几种实用的实现方法:
首先先补全你提供的XML内容(方便后续代码演示):
<?xml version="1.0" encoding="UTF-8"?> <test:main xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:test="http://www.testexample.com/test" xmi:id="_BMseoD4mEeiL8o0bAkMKoA"> <childNode xmi:id="_9_RgZj4lEeiL8o0bAkMKoA" name="Boo!" number="1.414"/> <childNode xmi:id="_9_RgYz4lEeiL8o0bAkMKoA" name="toto" number="42"/> <childNode xmi:id="__o_QMT4lEeiL8o0bAkMKoA" name="sample" number="3.14"/> </test:main>
方法一:注册命名空间后遍历节点
这种方法适合需要严格遵循XML命名空间规则的场景,通过注册命名空间前缀和对应的URI,精准定位节点:
def xmlContent = '''上面的XML内容''' def slurper = new XmlSlurper() // 注册XML中用到的命名空间 slurper.registerNamespace('test', 'http://www.testexample.com/test') slurper.registerNamespace('xmi', 'http://www.omg.org/XMI') def rootNode = slurper.parseText(xmlContent) // 遍历所有childNode,提取属性值 rootNode.childNode.each { child -> println "xmi:id = ${child.@'xmi:id'}" println "name = ${child.@name}" println "number = ${child.@number}" println "---" }
注意:对于带命名空间的属性(比如
xmi:id),需要用@'xmi:id'的写法来引用,避免Groovy语法解析错误。
方法二:忽略命名空间简化处理
如果你的目标节点childNode本身不带命名空间,也可以直接忽略XML的命名空间声明,代码会更简洁:
def xmlContent = '''你的XML内容''' // 第二个参数设为false,忽略XML的命名空间 def slurper = new XmlSlurper(false, false) def root = slurper.parseText(xmlContent) root.childNode.each { child -> println "xmi:id = ${child.@'xmi:id'}" println "name = ${child.@name}" println "number = ${child.@number}" }
方法三:获取单个节点的指定属性
如果你只需要提取某个特定节点的属性,比如第一个childNode的name和number,可以直接通过索引定位并转换类型:
def xmlContent = '''你的XML内容''' def slurper = new XmlSlurper() slurper.registerNamespace('test', 'http://www.testexample.com/test') def rootNode = slurper.parseText(xmlContent) // 获取第一个childNode的name属性 def firstChildName = rootNode.childNode[0].@name.text() // 获取number属性并直接转为Double类型 def firstChildNumber = rootNode.childNode[0].@number.toDouble() println "第一个节点的name: $firstChildName" println "第一个节点的number(数字类型): $firstChildNumber"
这些方法应该能覆盖你提取属性值的需求了,根据实际场景选对应的方式就行。
内容的提问来源于stack exchange,提问作者Thibault Santonja
相关产品推荐
相关产品推荐

