2012-04-09 10 views
4

Ich bin ein Grails-Neuling, der an einem Projekt zum Spaß arbeitet. Ich bin eine Klasse wie diese Serialisierung:Konvertieren von XML zu Domänenobjekt in Grails

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

die versucht, eine Klasse deserialisieren mit der XMLSlurper wie folgt aus:

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

Ich versuche, dieses Objekt zu rekonstruieren:

Listing{ 

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

} 

von diesem 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> 

Zuerst habe ich Probleme mit den Werten jedes Knotens. Ich habe def Verkäufer = neuer Kunde versucht (Name: VerkäuferNode. @ Benutzername), aber das funktioniert nicht, da ich annehme, dass @username ein Attribut und kein Element sein muss. Zweitens, muss ich dieses XML "von Hand" analysieren? Gibt es keinen besseren Weg, dieses XML automatisch zu deserialisieren?

Ich habe mir schon ein paar Posts angeschaut und auch dieses: Import XML into a Grails Domain Class aber wie Sie sehen können, hat meine XML keine Attribute wie die XML in diesem Post. automatisch

Danke,

Antwort

5

Wenn die Quelle der XML eine Web-Anfrage ist, können Sie parseRequest: true zum UrlMapping für Ihren Controller hinzufügen, wird analysieren grails die XML-Anfrage. Das XML wird als params dargestellt und Sie können die Datenbindung wie jede andere Anfrage durchführen.

Wenn Sie den XML-Code von einer anderen Quelle erhalten, sehen Sie sich die Konvertierung der XML-Parameterkarte in der Klasse XMLParsingParameterCreationListener.groovy an.

+0

@atylor: Danke für die Antwort. Ich hatte noch keine Gelegenheit das zu versuchen. Ich werde es heute Abend tun und morgen zu dir kommen. – Buzzer

+0

Weitere Details finden Sie unter http://grails.org/doc/2.2.4/guide/webServices.html - suchen Sie nach "parseRequest" und Sie werden so etwas finden: '"/product/$ id "(controller:" Produkt ", parseRequest: true)' – Jason

0

ich in der Klasse aTaylor aussahen vorgeschlagen, aber aus Zeitgründen beendet ich auf diese Weise die XML mit dem slurper Parsen up:

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

Ich wurde durch die Tatsache eingeschränkt, dass ich nur auf Textwerte bekommen . Ich konnte beispielsweise die Gebotselemente nicht in eine Sammlung deserialisieren und Berechnungen wie Gebote durchführen.Max (b-> b.amount). Das war mein ultimatives Ziel.

BTW - Dies war keine Web-Anfrage. Es war eine MQ-Nachricht, die als XML serialisiert wurde.

Verwandte Themen