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

Groovy中XmlParser与XmlSlurper使用报错:需实现指定XML处理方法

解决Groovy XmlSlurper解析XmlParser结果报错的问题

你遇到的问题核心在于**XmlParser.parse(fileName)返回的不是XML字符串,而是一个DOM Node对象**,直接把它传给XmlSlurper.parseText()自然会报错——因为parseText()需要的是原始XML文本内容,不是已经解析过的节点树。

接下来我们严格按照练习要求实现这两个方法:

1. 正确实现readFileContent(fileName)

这个方法的目标是读取XML文件内容并返回字符串,直接读取文件文本即可,无需用XmlParser解析:

def readFileContent(String fileName) {
    // 直接读取文件的全部文本内容,显式指定UTF-8编码匹配你的XML声明
    new File(fileName).getText('UTF-8')
}

2. 实现loadStudents(xmlString)

拿到XML字符串后,用XmlSlurper.parseText()解析,再提取所有student节点转换成结构化的学生列表:

def loadStudents(String xmlString) {
    def slurper = new XmlSlurper()
    def studentsRoot = slurper.parseText(xmlString)
    
    // 遍历每个student节点,将属性转换成Map存储
    studentsRoot.student.collect { student ->
        [
            id: student.id.text().toInteger(),
            registerNumber: student.registerNumber.text().toInteger(),
            name: student.name.text()
        ]
    }
}

完整测试代码

把两个方法结合起来验证功能:

def readFileContent(String fileName) {
    new File(fileName).getText('UTF-8')
}

def loadStudents(String xmlString) {
    def slurper = new XmlSlurper()
    def studentsRoot = slurper.parseText(xmlString)
    
    studentsRoot.student.collect { student ->
        [
            id: student.id.text().toInteger(),
            registerNumber: student.registerNumber.text().toInteger(),
            name: student.name.text()
        ]
    }
}

// 测试调用(替换成你的XML文件路径)
def xmlContent = readFileContent('students.xml')
def studentsList = loadStudents(xmlContent)

// 打印结果验证
studentsList.each { println "学生信息:${it}" }

为什么之前的代码报错?

你之前的代码:

def xmlString = new XmlParser().parse(fileName) 
def students = new XmlSlurper().parseText(xmlString)

这里xmlString实际上是Node类型(XmlParser解析后的DOM节点对象),当你把它传给parseText()时,Groovy会自动调用它的toString()方法,得到的是类似students[attributes={}; value=[student[...], ...]]的非XML格式字符串,这显然不符合XmlSlurper的解析要求,所以会抛出「content is not allowed in prolog」(你可能误写成prolong)的错误。

这样就完全满足练习要求:通过readFileContent读取文件返回字符串,再通过loadStudents接收字符串并解析成学生列表。

内容的提问来源于stack exchange,提问作者vinayP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:06:28