4

私は楽しみのためにプロジェクトに取り組んでいる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(name:sellerNode。@ username)を試しましたが、@ usernameは要素ではなく属性である必要があると想定しているため、機能しません。次に、このxmlを「手動で」解析する必要がありますか?このxmlを自動的に逆シリアル化するためのより良い方法はありませんか?

私はすでにいくつかの投稿を見て、これを含めました:XMLをGrailsドメインクラスにインポート しますが、ご覧のとおり、私のxmlにはこの投稿のxmlのような属性がありません。

ありがとう、

4

2 に答える 2

5

XMLのソースがWebリクエストの場合parseRequest: true、コントローラーのUrlMappingに追加できます。grailsはXMLリクエストを自動的に解析します。XMLはとして表示されparams、他のリクエストと同じようにデータバインディングを実行できます。

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

于 2012-04-09T17:17:09.403 に答える
0

私はaTaylorが提案したクラスを見ましたが、時間の制約のために、次のようにslurperでxmlを解析することになりました。

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

私はテキスト値でしか取得できないという事実に制約されていました。たとえば、bids要素をコレクションに逆シリアル化して、bids.Max(b-> b.amount)のような計算を実行することはできませんでした。それが私の究極の目標でした。

ところで-これはWebリクエストではありませんでした。これは、xmlとしてシリアル化されたMQメッセージでした。

于 2012-04-17T13:43:35.833 に答える