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
相关产品推荐
相关产品推荐

