我是一个有趣的项目的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卖家=新客户(名称:sellerNode。@ username),但这不起作用,因为我认为@username需要是属性而不是元素。 其次,我必须“手动”解析这个xml吗?是不是有更好的方法来自动反序列化这个xml?
我已经查看了几个帖子,包括这个帖子:Import XML into a Grails Domain Class但是正如您所看到的,我的xml在此帖子中没有像xml这样的属性。
谢谢,
答案 0 :(得分:5)
如果XML的来源是Web请求,您可以将parseRequest: true
添加到控制器的UrlMapping,Grails将自动解析XML请求。 XML将显示为params
,您可以像任何其他请求一样进行数据绑定。
如果您从其他来源获取XML,请查看课程XMLParsingParameterCreationListener.groovy
中的XML到参数地图转换。
答案 1 :(得分:0)
我确实看过aTaylor建议的类,但由于时间的限制,我最终用这种方式解析了xml:
def listing = new XmlSlurper().parseText(listingXML)
def winner = listing."winner"."username".text()
我受到以下事实的限制:我只能获得文本值。例如,我无法将出价元素反序列化为集合,并执行bid.Max(b-&gt; b.amount)等计算。那是我的终极目标。
BTW - 这不是网络请求。它是一个序列化为xml的MQ消息。