2012-04-09 16 views
4

私は、楽しいためにプロジェクトを進めているgrails初心者です。私はこのようなクラスをシリアル化しています:Grailsのxmlをドメインオブジェクトに変換する

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] 
    } 

} 

from this 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(名前:sellerNode。@ username)を試しましたが、@usernameは要素ではなく属性でなければならないと仮定しているため、これは機能しません。 第2に、このXMLを「手で」解析する必要がありますか?このxmlを自動的に非直列化するための良い方法はありませんか?

私はすでにいくつかの投稿を見て、これを含めて:Import XML into a Grails Domain Classしかし、私のxmlにはこの記事のxmlのような属性はありません。 XMLのソースはWebリクエストである場合

おかげで、

答えて

5

は、あなたのコントローラのUrlMappingにparseRequest: trueを追加することができ、Grailsは自動的にXML要求を解析します。 XMLはparamsと表示され、他の要求と同じようにデータバインディングを実行できます。

別のソースからXMLを取得している場合は、クラスXMLParsingParameterCreationListener.groovyのXML toパラメータマップ変換を見てください。

+0

@atylor:返信ありがとうございます。私はこれをまだ試してみる機会がありませんでした。私は今夜​​こんなことをして、明日にあなたに行きます。 – Buzzer

+0

詳細はhttp://grails.org/doc/2.2.4/guide/webServices.html - "parseRequest"を検索すると、次のようなものが見つかります: ''/product/$ id ''(コントローラ: product "、parseRequest:true)' – Jason

0

私はクラスaTaylorを見なかったが示唆されたが時間の制約に私はslurperと、このようにXMLを解析することになった:私は、テキストのみの値で取得することができるという事実によって制約された

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

。たとえば、bids要素をコレクションにデシリアライズしてbids.Max(b-> b.amount)のような計算を実行できませんでした。それが私の究極の目標でした。

BTW - これはウェブリクエストではありません。これはxmlとしてシリアライズされたMQメッセージでした。

関連する問題