JAXB和物业订购

我想从我的Java类的序列化XML输出,以遵守Java类中的属性的顺序。

看来,JAXB按字母顺序排列。

我可以通过使用@XmlTypepropOrder并指定所有的属性,但我有一个类与许多属性,这些还没有最终确定。

我读到,指定一个空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> 

我想我的输出是(作为我class的财产秩序):

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

感谢您的任何帮助。

有可能使用:

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

只需取消这样的代码注释:

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

这是正确的用法。

注意:我领导EclipseLink JAXB(MOXy)

Javareflection返回字段/属性列表的顺序不能保证。 这就是JAXB实现不使用它来确定元素顺序的原因。

默认情况下,JAXB不提供保证sorting 。 然而,大多数(如果不是所有的JAXB实现)使用字母顺序,因为它是确定性的。 为了保证这个顺序,你必须如下注释你的class级:

 @XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL) public class Foo { ... } 
 @XmlType(propOrder={"company", "scheme", "agreementNumber"}) 

这是正确的,但你有尝试过吗?

 @XmlType(propOrder={"Company", "Scheme", "AgreementNumber"}) 

这个线程是旧的,但值得抛出我如何得到我的属性,以正确的顺序生成XML和不使用字母顺序,因为这是不受欢迎的。 有一点需要注意的是,我使用的是wink和jaxb,它们的行为可能与其他提供者不同。 媚眼对于财产清单中的内容非常具体。 即使是我标记为xml瞬态的元素,或者根本没有进行装饰的元素都需要成为其中的一部分

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

…我承认,我还不够,为什么它的工作!:)

据此,兄弟XML元素的顺序不能保证。

只需添加:

 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder={"field1", "field2", ...}) 

@XmlType(propOrder={"prop1", "prop2"}) ,只能声明在类中声明的propertyName 。 你不能申报

 XMLElement name ( @XmlElement(name="Company")) 

在上面提到的XmlType propOrder中。

您必须将propOrderXmlAccessType注释添加到类中。

 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder = {"PartyType","PartyName","PartyAddress"})