3

これをどのようにマッピングしますか

    <urn:envelope xmlns:urn="urn:com.twinstrata.webservice:2.1">
<urn:encoded>
    <urn:response>
        <urn:license>
            <urn:licenseTag>WHATEVER934</urn:licenseTag>
            <urn:accountNumber>2016763117</urn:accountNumber>
            <urn:licenseType>TRIAL</urn:licenseType>
            <urn:licenseClass>Credentialed</urn:licenseClass>
            <urn:volumeAllowed>Unlimited</urn:volumeAllowed>
            <urn:volumeProvisioned>0</urn:volumeProvisioned>
            <urn:snapshotLimit>Unlimited</urn:snapshotLimit>
            <urn:snapshotLimitPerVolume>10</urn:snapshotLimitPerVolume>
            <urn:status>Active</urn:status>
            <urn:usedSpace>0</urn:usedSpace>
            <urn:expirtationDate>2013-03-27 14:48:47.0</urn:expirtationDate>
            <urn:storageLimit>Unlimited</urn:storageLimit>
        </urn:license>
    </urn:response>
</urn:encoded>
<urn:signature>Hl8rk2aTEsOkkq5e383LH0BqdFfmVcKIg9FuFEnnrlFk9fwYVEQwkrm/7MPM2Zmli2Um00L2Ab25tZg2w8pEzXyDsd+vwCAH0ypQwhIVPayDjgYKlYXbnkqG5S+7qiVbqD2qZDektuPoEWvaSdxO3ZgUibT+nnrO0kl6E7i4lB0=
</urn:signature>

これに

    package com.folio3.bean;

    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;

    @XmlRootElement(name = "envelope" , namespace = "urn:com.twinstrata.webservice:2.1")
    public class ResponseXML {


        private String userName;
        private String license;
        private String signature;
        private String licenseTag;
        private String accountNumber;
        private String licenseType;
        private String licenseClass;
        private String volumeAllowed;
        private String volumeProvisioned;
        private String publicKey;

        @XmlElement(name = "userName" , namespace = "urn:com.twinstrata.webservice:2.1")
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }

        @XmlElement(name = "license" , namespace = "urn:com.twinstrata.webservice:2.1")
        public String getLicense() {
            return license;
        }
        public void setLicense(String license) {
            this.license = license;
        }

        @XmlElement(name = "signature" , namespace = "urn:com.twinstrata.webservice:2.1")
        public String getSignature() {
            return signature;
        }
        public void setSignature(String signature) {
            this.signature = signature;
        }


        @XmlElement(name = "licenseTag" , namespace = "urn:com.twinstrata.webservice:2.1")
        public String getLicenseTag() {
            return licenseTag;
        }
        public void setLicenseTag(String licenseTag) {
            this.licenseTag = licenseTag;
        }

        @XmlElement(name = "accountNumber" , namespace = "urn:com.twinstrata.webservice:2.1")
        public String getAccountNumber() {
            return accountNumber;
        }
        public void setAccountNumber(String accountNumber) {
            this.accountNumber = accountNumber;
        }

        @XmlElement(name = "licenseType" , namespace = "urn:com.twinstrata.webservice:2.1")
        public String getLicenseType() {
            return licenseType;
        }
        public void setLicenseType(String licenseType) {
            this.licenseType = licenseType;
        }

        @XmlElement(name = "licenseClass" , namespace = "urn:com.twinstrata.webservice:2.1")
        public String getLicenseClass() {
            return licenseClass;
        }
        public void setLicenseClass(String licenseClass) {
            this.licenseClass = licenseClass;
        }

        @XmlElement(name = "volumeAllowed" , namespace = "urn:com.twinstrata.webservice:2.1")
        public String getVolumeAllowed() {
            return volumeAllowed;
        }
        public void setVolumeAllowed(String volumeAllowed) {
            this.volumeAllowed = volumeAllowed;
        }

        @XmlElement(name = "volumeProvisioned" , namespace = "urn:com.twinstrata.webservice:2.1")
        public String getVolumeProvisioned() {
            return volumeProvisioned;
        }
        public void setVolumeProvisioned(String volumeProvisioned) {
            this.volumeProvisioned = volumeProvisioned;
        }

        @XmlElement(name = "publicKey" , namespace = "urn:com.twinstrata.webservice:2.1")
        public String getPublicKey() {
            return publicKey;
        }
        public void setPublicKey(String publicKey) {
            this.publicKey = publicKey;
        }


        @Override
        public String toString() {
            StringBuilder builder = new StringBuilder();
            builder.append("ResponseXML [userName=");
            builder.append(userName);
            builder.append(", license=");
            builder.append(license);
            builder.append(", signature=");
            builder.append(signature);
            builder.append(", licenseTag=");
            builder.append(licenseTag);
            builder.append(", accountNumber=");
            builder.append(accountNumber);
            builder.append(", licenseType=");
            builder.append(licenseType);
            builder.append(", licenseClass=");
            builder.append(licenseClass);
            builder.append(", volumeAllowed=");
            builder.append(volumeAllowed);
            builder.append(", volumeProvisioned=");
            builder.append(volumeProvisioned);
            builder.append(", publicKey=");
            builder.append(publicKey);
            builder.append("]");
            return builder.toString();
        }
    }

現在、XML の 1 つのプロパティ、つまり「署名」のみをマップします。簡単にするために、他のクラスを作成して、その中にオブジェクトをネストしたくありません。ネストされた xml タグを単一の Java クラスで解析したいだけです。それ、どうやったら出来るの ?

4

2 に答える 2

1

注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。

ResponseXML

MOXy の@XmlPath拡張機能を使用してユース ケースをマッピングできます (参照: http://blog.bdoughan.com/2010/09/xpath-based-mapping-geocode-example.html )。以下は、ユースケースの部分的なマッピングです。

package forum15391077;

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement(name = "envelope")
@XmlType(propOrder={"licenseTag", "accountNumber", "licenseType", "licenseClass", "volumeAllowed", "volumeProvisioned", "signature", "license", "publicKey", "userName"})
@XmlAccessorType(XmlAccessType.FIELD)
public class ResponseXML {

    private String userName;
    private String license;
    private String signature;

    @XmlPath("urn:encoded/urn:response/urn:license/urn:licenseTag/text()")
    private String licenseTag;

    @XmlPath("urn:encoded/urn:response/urn:license/urn:accountNumber/text()")
    private String accountNumber;

    @XmlPath("urn:encoded/urn:response/urn:license/urn:licenseType/text()")
    private String licenseType;

    @XmlPath("urn:encoded/urn:response/urn:license/urn:licenseClass/text()")
    private String licenseClass;

    @XmlPath("urn:encoded/urn:response/urn:license/urn:volumeAllowed/text()")
    private String volumeAllowed;

    @XmlPath("urn:encoded/urn:response/urn:license/urn:volumeProvisioned/text()")
    private String volumeProvisioned;

    private String publicKey;

}

パッケージ情報

パッケージ レベルの@XmlSchemaアノテーションを使用して名前空間の修飾を指定します ( http://blog.bdoughan.com/2010/08/jaxb-namespaces.htmlを参照)。また、アノテーションurnで利用したプレフィックスを定義するためにも使用します。@XmlPath

@XmlSchema(
    namespace="urn:com.twinstrata.webservice:2.1",
    elementFormDefault=XmlNsForm.QUALIFIED,
    xmlns={
        @XmlNs(namespaceURI = "urn:com.twinstrata.webservice:2.1", prefix = "urn")
    }
)
package forum15391077;

import javax.xml.bind.annotation.*;

jaxb.properties

MOXy を JAXB プロバイダーとして指定するにはjaxb.properties、次のエントリを使用して、ドメイン モデルと同じパッケージで呼び出されるファイルを含める必要があります ( http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-asを参照)。 -your.html )

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

デモ

MOXy は標準の JAXB 実装であるため、標準の JAXB ランタイム API が使用されます。

package forum15391077;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(ResponseXML.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum15391077/input.xml");
        ResponseXML response = (ResponseXML) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(response, System.out);
    }

}

input.xml/出力

以下は、私がマッピングしたユース ケースの一部に基づくサンプル XML ドキュメントです。

<?xml version="1.0" encoding="UTF-8"?>
<urn:envelope xmlns:urn="urn:com.twinstrata.webservice:2.1">
   <urn:encoded>
      <urn:response>
         <urn:license>
            <urn:licenseTag>WHATEVER934</urn:licenseTag>
            <urn:accountNumber>2016763117</urn:accountNumber>
            <urn:licenseType>TRIAL</urn:licenseType>
            <urn:licenseClass>Credentialed</urn:licenseClass>
            <urn:volumeAllowed>Unlimited</urn:volumeAllowed>
            <urn:volumeProvisioned>0</urn:volumeProvisioned>
         </urn:license>
      </urn:response>
   </urn:encoded>
   <urn:signature>Hl8rk2aTEsOkkq5e383LH0BqdFfmVcKIg9FuFEnnrlFk9fwYVEQwkrm/7MPM2Zmli2Um00L2Ab25tZg2w8pEzXyDsd+vwCAH0ypQwhIVPayDjgYKlYXbnkqG5S+7qiVbqD2qZDektuPoEWvaSdxO3ZgUibT+nnrO0kl6E7i4lB0=
    </urn:signature>
</urn:envelope>
于 2013-03-13T22:04:10.050 に答える
-2

ネストされたクラスを作成し、適切な JAXB アノテーションを使用することで、機能するようにしました。

于 2013-03-16T05:44:47.647 に答える