[英]Groovy: Using Closure to create and return Map Elements
我正在导入XML,然后根据XML中的信息创建对象列表。
这是我的XML的示例:
<DCUniverse>
<SuperHeroes>
<SuperHero>
<SuperHeroName>SuperMan</SuperHeroName>
<SuperHeroDesc>Surviver of Krypton; Son of Jor-el</SuperHeroDesc>
<SuperHeroCode>SM</SuperHeroCode>
<SuperHeroAttrs>
<SuperHeroAttr Name="Strength">All</SuperHeroAttr>
<SuperHeroAttr Name="Weakness">Kryptonite</SuperHeroAttr>
<SuperHeroAttr Name="AlterEgo">Clark Kent</SuperHeroAttr>
</SuperHeroAttrs>
</SuperHero>
<SuperHero>
<SuperHeroName>Batman</SuperHeroName>
<SuperHeroDesc>The Dark Knight of Gothom City</SuperHeroDesc>
<SuperHeroCode>BM</SuperHeroCode>
<SuperHeroAttrs>
<SuperHeroAttr Name="Strength">Intellect</SuperHeroAttr>
<SuperHeroAttr Name="Weakness">Bullets</SuperHeroAttr>
<SuperHeroAttr Name="AlterEgo">Bruce Wayne</SuperHeroAttr>
</SuperHeroAttrs>
</SuperHero>
</SuperHeroes>
<DCUniverse>
这是我正在运行的用于创建对象的groovy脚本的示例:
class Hero{
def SuperHeroName
def SuperHeroDesc
def SuperHeroCode
def SuperHeroAttrLst = [:]
Hero(String name, String desc, String code, attrLst){
this.SuperHeroName=name
this.SuperHeroDesc=desc
this.SuperHeroCode=code
this.SuperHeroAttrLst.putAll(attrLst)
}
}
def heroList = []
def heroDoc = new XmlParser().parse('dossier.xml')
heroDoc.SuperHeroes.each{ faction ->
faction.SuperHero.each{ hero ->
heroList += new Hero( hero.SuperHeroName.text(),
hero.SuperHeroDesc.text(),
hero.SuperHeroCode.text(),
hero.SuperHeroAttrs.SuperHeroAttr.each{ attr ->
return [ (attr.'@Name') : (attr.text()) ]
})
}
}
当我运行上面的代码时,出现以下错误:
java.lang.ClassCastException: groovy.util.Node cannot be cast to java.util.Map$Entry
我有一种强烈的感觉,它与闭包试图发送给Hero Class Constructor的最后一个变量有关。 注释掉
this.SuperHeroAttrLst.putAll(attrLst)
在Hero构造函数中,该脚本至少可以正确解析。 我想做的是基于XML创建一个类,并将其放在列表中,例如:
heroList += new Hero('Batman',
'The Dark Knight of Gothom City',
'BM',
['Strength':'Intellect', 'Weakness':'Bullets', 'AlterEgo':'Bruce Wayne'] )
但是,我的变量类型输入不正确,我对Groovy(或Java)的语法了解不足,无法使其正常工作。
可以提供的任何帮助将不胜感激。 感谢您的时间。
我认为您应该将hero.SuperHeroAttrs.SuperHeroAttr.each{ //blah blah
更改为:
hero.SuperHeroAttrs.inject([:]) { attributes, attr ->
attributes[attr.'@Name'] = attr.text()
return attributes
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.