Groovy: использование Closure для создания и возврата элементов карты - PullRequest
0 голосов
/ 24 марта 2011

Я импортирую 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

У меня сильное чувство, что это как-то связано с последней переменной, которую замыкание пытается отправить в конструктор класса героев. Комментирование

this.SuperHeroAttrLst.putAll(attrLst)

в конструкторе героев позволяет скрипту по крайней мере правильно анализировать. Я пытаюсь создать класс на основе XML и поместить его в список, например:

heroList += new Hero('Batman',
 'The Dark Knight of Gothom City',
 'BM',
 ['Strength':'Intellect', 'Weakness':'Bullets', 'AlterEgo':'Bruce Wayne'] )

Однако моя переменная неверна, и я недостаточно знаю синтаксис Groovy (или Java), чтобы он работал.

Любая помощь, которая может быть оказана, будет принята с благодарностью. Спасибо за ваше время.

1 Ответ

0 голосов
/ 24 марта 2011

Я думаю, вы должны изменить hero.SuperHeroAttrs.SuperHeroAttr.each{ //blah blah на:

hero.SuperHeroAttrs.inject([:]) { attributes, attr ->
    attributes[attr.'@Name'] = attr.text()
    return attributes
}
...