2012-04-09 5 views
4

Я новичок grails, работающий над проектом для развлечения. Я сериализация класса как это:Преобразование xml в объект домена в 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>[email protected]</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>[email protected]</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>[email protected]</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>[email protected]</emailAddress> 
     <enabled>false</enabled> 
     <password>secret</password> 
     <passwordExpired>false</passwordExpired> 
     <username>validguy</username> 
    </winner> 
</listing> 

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

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

Спасибо,

ответ

5

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

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

+0

@atylor: Спасибо за ответ. У меня еще не было возможности попробовать это. Я сделаю это сегодня вечером и доберусь до тебя завтра. – Buzzer

+0

Подробнее о http://grails.org/doc/2.2.4/guide/webServices.html - найдите «parseRequest», и вы найдете что-то вроде этого: '/ product/$ id" (controller: " продукт ", parseRequest: true)' – Jason

0

Я смотрю на класс aTaylor предложил, но из-за нехватки времени я в конечном итоге разбора XML с Slurper таким образом:

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

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

BTW - Это не был веб-запрос. Это сообщение MQ было сериализовано как xml.