JAXB 和属性排序

我希望 Java 类的序列化 XML 输出符合 Java 类中属性的顺序。

JAXB 似乎是按字母顺序排序的。

我可以通过使用 @XmlType保持秩序并指定所有属性来覆盖它,但是我有一个具有许多属性的类,而且这些属性还没有最终确定。

我读到指定一个空的 保持秩序可以做到这一点,但它没有。

我的示例类:

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>

谢谢你的帮助。

93951 次浏览

注: 我领导 EclipseLink JAXB (MOXy)

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

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

@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class Foo {
...
}

根据 这个,兄弟 XML 元素的顺序不能得到保证。

可以使用:

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

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

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

这是正确的用法。

这个线程已经很旧了,但是值得一提的是,我是如何让属性按照正确的顺序生成 xml,而不是按照字母顺序排列,因为这是不需要的。需要注意的一点是,我使用的是 wink 和 jaxb,它们的行为可能与其他提供程序不同。Wink 对清单上的内容非常具体。甚至我标记为 xml 瞬态的或根本没有修饰的元素也需要成为其中的一部分

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

... 我承认我不知道它为什么有用! :)

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

没错,但你试过这个吗?

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

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

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

XmlType propOrder中,如上所述。

只要加上:

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

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

@XmlAccessorType(XmlAccessType.FIELD)


@XmlType(propOrder = {"PartyType","PartyName","PartyAddress"})

这是正确的: 请在下面一行取消注释

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