我希望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>
感谢您提供任何帮助。
答案 0 :(得分:67)
可以使用:
@XmlType (propOrder={"prop1","prop2",..."propN"})
只需取消注释代码:
//@XmlType(propOrder={"company", "scheme", "agreementNumber"})
这是正确的用法。
答案 1 :(得分:25)
注意:我领导EclipseLink JAXB (MOXy)
无法保证Java反射返回字段/属性列表的顺序。这就是JAXB实现不使用它来确定元素顺序的原因。
默认情况下,JAXB提供no guaranteed ordering。但是大多数(如果不是所有JAXB实现)都使用字母顺序,因为它是确定性的。为了保证这种顺序,您必须按如下方式注释您的课程:
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class Foo {
...
}
答案 2 :(得分:5)
@XmlType(propOrder={"company", "scheme", "agreementNumber"})
这是对的,但你试过这个吗?
@XmlType(propOrder={"Company", "Scheme", "AgreementNumber"})
答案 3 :(得分:3)
这个线程很老但是值得抛出我如何让我的属性以正确的顺序生成xml而不使用字母顺序,因为这是不希望的。需要注意的一点是,我使用的是wink和jaxb,其行为可能与其他提供商不同。 Wink对于财产清单中的内容非常具体。即使是我标记为xml瞬态或根本没有装饰的元素也必须是
的一部分@XmlRootElement(name = "Product")
@XmlType(name="",propOrder={"productName","productVersion",..."propN"})
...诚然,我不够为什么它有效!:)
答案 4 :(得分:1)
根据this,不保证兄弟XML元素的顺序。
答案 5 :(得分:0)
在@XmlType(propOrder={"prop1", "prop2"})
中,您只能声明您在课程中声明的propertyName
。你不能声明
XMLElement name (
@XmlElement(name="Company"))
如上所述XmlType
propOrder
中的..
答案 6 :(得分:0)
只需添加:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"field1", "field2", ...})
答案 7 :(得分:-1)
您必须将propOrder
和XmlAccessType
注释添加到班级。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {"PartyType","PartyName","PartyAddress"})