72

Java クラスからのシリアライズされた XML 出力で、Java クラスのプロパティの順序を尊重したいと考えています。

JAXBはアルファベット順に並んでいるようです。

propOrder@XmlTypeを使用してすべてのプロパティを指定することでこれをオーバーライドできますが、多くのプロパティを持つクラスがあり、これらはまだファイナライズされていません。

空のpropOrderを指定するとそれができると読みましたが、そうではありません。

私の例のクラス:

package test;

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

@XmlRootElement
//@XmlType(propOrder={"company", "scheme", "agreementNumber"})
@XmlType(propOrder={}) // makes no difference - still alphabetical in XML 
public class CustomerPlan2 {

    private String company;
    private String scheme;
    private String agreementNumber;

    @XmlElement(name="Company")
    public String getCompany() {
        return company;
    }
    public void setCompany(String company) {
        this.company = company;
    }

    @XmlElement(name="Scheme")
    public String getScheme() {
        return scheme;
    }
    public void setScheme(String scheme) {
        this.scheme = scheme;
    }

    @XmlElement(name="AgreementNumber")
    public String getAgreementNumber() {
        return agreementNumber;
    }
    public void setAgreementNumber(String agreementNumber) {
        this.agreementNumber = agreementNumber;
    }
}

私のシリアライズコード:

    CustomerPlan2 cp2 = new CustomerPlan2();

    cp2.setCompany("company");
    cp2.setScheme("scheme");
    cp2.setAgreementNumber("agreementnumber");
    JAXBContext context = JAXBContext.newInstance(CustomerPlan2.class);
    Marshaller marshaller = context.createMarshaller();

    marshaller.marshal(cp2, new FileWriter("C:\\temp\\out.xml"));

出力:

    <customerPlan2>
      <AgreementNumber>agreementnumber</AgreementNumber> 
      <Company>company</Company> 
      <Scheme>scheme</Scheme> 
    </customerPlan2>

出力を(クラスのプロパティの順序として)次のようにします。

    <customerPlan2>
      <Company>company</Company>
      <Scheme>scheme</Scheme> 
      <AgreementNumber>agreementnumber</AgreementNumber> 
    </customerPlan2>

これについて助けてくれてありがとう。

4

8 に答える 8

78

以下を使用して可能です:

@XmlType (propOrder={"prop1","prop2",..."propN"})

次のようにコードのコメントを外してください。

//@XmlType(propOrder={"company", "scheme", "agreementNumber"})

これが正しい使い方です。

于 2011-06-08T07:21:58.170 に答える
27

注:私はEclipseLink JAXB(MOXy)を主導しています

Javaリフレクションがフィールド/プロパティのリストを返す順序は保証されていません。これが、JAXB実装が要素の順序を決定するためにそれを使用しない理由です。

デフォルトでは、JAXBは保証された順序を提供しません。ただし、ほとんどの(すべてではないにしても)JAXB実装は、決定論的であるため、アルファベット順を使用します。この順序を保証するには、クラスに次のように注釈を付ける必要があります。

@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class Foo {
    ...
}
于 2011-03-25T16:34:14.300 に答える
5
@XmlType(propOrder={"company", "scheme", "agreementNumber"})

それは正しいですが、これを試しましたか?

@XmlType(propOrder={"Company", "Scheme", "AgreementNumber"})
于 2014-02-17T11:57:01.423 に答える
3

このスレッドは古いですが、プロパティが適切な順序で xml を生成する方法をスローする価値があり、アルファベット順を使用しないのは望ましくないためです。注意すべきことの 1 つは、私が使用している wink と jaxb は、他のプロバイダーとは異なる動作をする可能性があることです。Wink は、properly リストにあるものについて非常に具体的でした。私が一時的なxmlとしてマークした要素、またはまったく装飾されていない要素でさえ、一部である必要がありました

@XmlRootElement(name = "Product")
@XmlType(name="",propOrder={"productName","productVersion",..."propN"})

...確かに、私はそれが機能する理由を十分に理解していません!:)

于 2012-08-17T14:47:26.463 に答える
1

これによると、兄弟XML要素の順序は保証されません。

于 2011-03-25T16:46:22.603 に答える
1

追加するだけです:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"field1", "field2", ...})
于 2014-12-09T16:50:42.743 に答える
-1

propOrderと のXmlAccessType注釈をクラスに追加する必要があります。

@XmlAccessorType(XmlAccessType.FIELD)

@XmlType(propOrder = {"PartyType","PartyName","PartyAddress"})
于 2016-08-19T08:45:13.130 に答える