Преобразование 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 ответа:
Если источником 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.