You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:38:19