JAXB和物业订购
我想从我的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>
我想我的输出是(作为我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
中。
您必须将propOrder
和XmlAccessType
注释添加到类中。
@XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder = {"PartyType","PartyName","PartyAddress"})