当从模式解组时,序列的顺序在jaxb中很重要

时间:2010-03-05 21:20:59

标签: java xsd jaxb

我有这个架构:     

<xs:complexType name="foo">
  <xs:sequence>
    <xs:element name="oneBar" type="xs:string" minOccurs="0"/>
    <xs:element name="twoBar" type="xs:string" minOccurs="0"/>
  </xs:sequence>
</xs:complexType>

当我试图解散这个

<foo>
  <oneBar>1</oneBar>
  <twoBar>2</twoBar>
</foo>

它有效 但是当我试图解组这个xml:

<foo>
   <twoBar>2</twoBar>
   <oneBar>1</oneBar>
</foo>

我得到了一个excelption,因为它关心订单 如果我试图在不使用模式的情况下解组相同的xml,它在两种情况下都可以工作 有什么想法吗?

正如Strawberry所指出的,如果你用sc替换xs:sequence:任何顺序都不重要,你们中的任何人都知道我需要在我的课程中添加什么注释,这样才能生成xs:任何schmea

通过从xs:any模式创建类来找到解决方案 您只需要使用XmlType注释您的类,并将prop命令设置为空,请参阅:

@XmlRootElement
@XmlType(name="foo",propOrder={})
public class Foo {
    @XmlElement
    public String oneBar; 
    @XmlElement
    public String twoBar;
} 

1 个答案:

答案 0 :(得分:5)

序列要求元素按顺序排列,例如from w3schools页面: -

  

指标指定   子元素必须出现在   特定订单:

在没有架构的情况下进行解组时,实际上并没有验证XML。

如果您希望您的架构不需要特定的排序,那么以下内容应该这样做: -

<xs:complexType name="foo">
  <xs:all>
    <xs:element name="oneBar" type="xs:string" minOccurs="0"/>
    <xs:element name="twoBar" type="xs:string" minOccurs="0"/>
  </xs:all>
</xs:complexType>

从Java注释的角度来看它。如果我有一个名为Test的类,其中包含两个字符串字段test1test2,则注释将为: -

有序案件,例如使用<sequence>

@XmlType(name="",propOrder={"test1","test2"})
@XmlRootElement(name="test")
public class Test
{
   @XmlElement(required=true)
   private String test1;
   @XmlElement(required=true)
   private String test2;
}

无序案件,例如使用<all>

@XmlType(name="",propOrder={})
@XmlRootElement(name="test")
public class Test
{
   @XmlElement(required=true)
   private String test1;
   @XmlElement(required=true)
   private String test2;
}