Преобразование xml в объект домена в Grails


Я новичок grails, работающий над проектом для удовольствия. Я сериализую класс следующим образом:

def msg = (listing as XML).toString()

Попытка десериализовать класс с помощью XMLSlurper выглядит следующим образом:

def root = new XmlSlurper().parseText(listingString)
def sellerNode = root.seller

Я пытаюсь восстановить этот объект:

Listing{

    Date dateCreated
        String description
        Date endDateTime
        String name
        Float startingPrice
        Customer winner
        static hasMany = [bids: Bid] // B-4
        static belongsTo = [seller: Customer]
    }

}

Из этого xml:

<?xml version="1.0" encoding="UTF-8"?>
<listing>
    <bids>
        <bid>
            <amount>10.5</amount>
            <bidder>
                <accountExpired>false</accountExpired>
                <accountLocked>false</accountLocked>
                <dateCreated/>
                <emailAddress>validguy@valid.com</emailAddress>
                <enabled>false</enabled>
                <password>secret</password>
                <passwordExpired>false</passwordExpired>
                <username>validguy</username>
            </bidder>
            <dateCreated>2012-04-08 21:16:41.423 CDT</dateCreated>
            <listing/>
        </bid>
        <bid>
            <amount>10.0</amount>
            <bidder>
                <accountExpired>false</accountExpired>
                <accountLocked>false</accountLocked>
                <dateCreated/>
                <emailAddress>validguy@valid.com</emailAddress>
                <enabled>false</enabled>
                <password>secret</password>
                <passwordExpired>false</passwordExpired>
                <username>validguy</username>
            </bidder>
            <dateCreated>2012-04-08 21:16:41.415 CDT</dateCreated>
            <listing/>
        </bid>
    </bids>
    <dateCreated/>
    <description>A test listing</description>
    <endDateTime>2012-04-09 21:16:41.407 CDT</endDateTime>
    <name>Default</name>
    <seller>
        <accountExpired>false</accountExpired>
        <accountLocked>false</accountLocked>
        <dateCreated/>
        <emailAddress>validguy@valid.com</emailAddress>
        <enabled>false</enabled>
        <password>secret</password>
        <passwordExpired>false</passwordExpired>
        <username>validguy</username>
    </seller>
    <startingPrice>10.0</startingPrice>
    <wasNotificationSent>false</wasNotificationSent>
    <winner>
        <accountExpired>false</accountExpired>
        <accountLocked>false</accountLocked>
        <dateCreated/>
        <emailAddress>validguy@valid.com</emailAddress>
        <enabled>false</enabled>
        <password>secret</password>
        <passwordExpired>false</passwordExpired>
        <username>validguy</username>
    </winner>
</listing>

Сначала у меня возникли проблемы с получением значений каждого узла. Я пробовал def seller = new Customer (имя: sellerNode.@username), но это не работает, так как я предполагаю, что @username должен быть атрибутом, а не элемент. Во-вторых, должен ли я анализировать этот xml "вручную"? Нет ли лучшего способа десериализовать этот xml автоматически?

Я уже посмотрел пару сообщений и в том числе это: импорт XML в доменный класс Grails однако, как вы можете видеть, мой xml не имеет атрибутов, подобных xml в этом сообщении.

Спасибо,

2 4

2 ответа:

Если источником XML является веб-запрос, вы можете добавить parseRequest: true в UrlMapping для вашего контроллера, grails автоматически проанализирует XML-запрос. XML будет представлен в виде params, и вы можете выполнить привязку данных так же, как и любой другой запрос.

Если вы получаете XML из другого источника, посмотрите на преобразование XML в параметр map в классе XMLParsingParameterCreationListener.groovy.

Я посмотрел на класс, предложенный атейлором, но из-за временных ограничений я закончил разбор xml с slurper следующим образом:

def listing = new XmlSlurper().parseText(listingXML)
def winner = listing."winner"."username".text()

Я был ограничен тем фактом, что я могу получить только текстовые значения. Например, я не мог десериализовать элементы bids в коллекцию и выполнять вычисления, подобные bids.Макс (b->B.сумма). Это была моя конечная цель.

Кстати-это не был веб-запрос. Это было сообщение MQ, сериализованное в формате xml.