Javaクラスからのシリアル化されたXML出力で、Javaクラスのプロパティの順序を尊重します。
JAXBはアルファベット順に注文しているようです。
@XmlType
をpropOrderで使用し、すべてのプロパティを指定することでこれをオーバーライドできますが、多くのプロパティを持つクラスがあり、これらはまだ確定していません。
空の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>
これについて助けてくれてありがとう。
以下を使用して可能です。
@XmlType (propOrder={"prop1","prop2",..."propN"})
このようなコードのコメントを外してください:
//@XmlType(propOrder={"company", "scheme", "agreementNumber"})
これは正しい使い方です。
注:リード EclipseLink JAXB(MOXy)
Javaリフレクションがフィールド/プロパティのリストを返す順序は保証されません。これが、JAXB実装が要素の順序を決定するためにそれを使用しない理由です。
デフォルトでは、JAXBは 保証された順序付けなし を提供します。ただし、確定的であるため、ほとんどの(すべてのJAXB実装ではないにしても)アルファベット順を使用します。この順序を保証するには、次のようにクラスに注釈を付ける必要があります。
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class Foo {
...
}
@XmlType(propOrder={"company", "scheme", "agreementNumber"})
正しいですが、これを試しましたか?
@XmlType(propOrder={"Company", "Scheme", "AgreementNumber"})
このスレッドは古いですが、適切な順序でxmlを生成するためにプロパティを取得した方法を投げる価値があり、それは望ましくないため、アルファベット順を使用していません。注意すべきことの1つは、他のプロバイダーとは異なる動作をする可能性のあるwinkとjaxbを使用していることです。ウィンクは、適切にリストされているものについて非常に具体的でした。 XMLトランジェントとしてマークした要素、またはまったく装飾されていない要素でさえ、
@XmlRootElement(name = "Product")
@XmlType(name="",propOrder={"productName","productVersion",..."propN"})
...確かに、なぜそれが機能するのか十分ではありません!:)
追加するだけです:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"field1", "field2", ...})
this によれば、兄弟のXML要素の順序は保証されていません。
@XmlType(propOrder={"prop1", "prop2"})
では、クラスで宣言したpropertyName
のみを宣言できます。宣言できません
XMLElement name (
@XmlElement(name="Company"))
上記のXmlType
propOrder
で。